LeetCode

来源:互联网 发布:vga矩阵切换器24进 编辑:程序博客网 时间:2024/06/17 21:09

33. Search in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.


在一个旋转过的数组中(数字不重复)查找一个数。

就,分情况讨论。主要是脑子得清醒,不然很容易晕orz。时间复杂度O(logn)

class Solution {public:    int search(vector<int>& nums, int target) {        if (nums.empty()) return -1;        int le = 0, ri = nums.size() - 1;        while (le < ri) {            int mid = (le + ri) >> 1;            if (nums[mid] == target) return mid;            else if (nums[le] <= nums[mid]) {                if (target >= nums[le] && target < nums[mid]) ri = mid - 1;                else le = mid + 1;            }            else {                if (target > nums[mid] && target <= nums[ri]) le = mid + 1;                else ri = mid - 1;            }        }        return nums[le] == target ? le : -1;    }};




81. Search in Rotated Sorted Array II

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Write a function to determine if a given target is in the array.

The array may contain duplicates.


在一个旋转过的数组中(数字有重复)查找一个数。

嗯,整体思路不变,只要要去除重复的数。时间复杂度O(n)感觉最坏情况下确实有这么多。。。

class Solution {public:    bool search(vector<int>& nums, int target) {        if (nums.empty()) return false;        int le = 0, ri = nums.size() - 1;        while (le < ri) {            while (le < ri && nums[le] == nums[le+1]) le++;            while (le < ri && nums[ri] == nums[ri-1]) ri--;            if (le >= ri) break;            int mid = (le + ri) >> 1;            if (nums[mid] == target) return true;            if (nums[le] <= nums[mid]) {                if (target >= nums[le] && target < nums[mid]) ri = mid - 1;                else le = mid + 1;            }            else {                if (target > nums[mid] && target <= nums[ri]) le = mid + 1;                else ri = mid - 1;            }        }        return nums[le] == target ? true : false;    }};




153. Find Minimum in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.


在一个旋转过的数组中寻找最小值。时间复杂度O(logn)

class Solution {public:    int findMin(vector<int>& nums) {        if (nums.empty()) return -1;        int mmin = nums[0];           int le = 0, ri = nums.size() - 1;        while (le < ri) {            int mid = (le + ri) >> 1;            if (nums[ri] >= nums[mid]) ri = mid;            else if (nums[le] <= nums[mid]) le = mid + 1;        }        return nums[le];    }};




154. Find Minimum in Rotated Sorted Array II

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

The array may contain duplicates.


在一个旋转过的数组中找到最小值(数组有重复值)。时间复杂度O(n)

class Solution {public:    int findMin(vector<int>& nums) {        if (nums.empty()) return -1;        int le = 0, ri = nums.size() - 1;        while (le < ri) {            while (le < ri && nums[le] == nums[le+1]) le++;            while (le < ri && nums[ri] == nums[ri-1]) ri--;            if (le >= ri) break;            int mid = (le + ri) >> 1;            if (nums[mid] <= nums[ri]) ri = mid;            else if (nums[mid] >= nums[le]) le = mid + 1;        }        return nums[le];    }};




原创粉丝点击