33. Search in Rotated Sorted Array&81. Search in Rotated Sorted Array II

来源:互联网 发布:宁夏网络干部培训 编辑:程序博客网 时间:2024/05/21 02:34

Suppose a sorted array 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.

二分检索,但是判断条件多了很多= =

class Solution {public:    int search(vector<int>& nums, int target) {                int left=0,right=nums.size()-1,mid;        while(left<=right){            mid=(left+right)/2;//原来在这里每次都要int mid=(left+right)/2,事实证明这样很慢,还是在外面定义好拿进来用比较快            if(nums[mid]==target) return mid;                        if(nums[mid]>nums[right]){//mid在左半部分,即mid左边是有序的                if(target>=nums[left]&&target<nums[mid]) right=mid-1;//若target在左边则向左边找                else left=mid+1;            }            //不太明白的是每一次left=mid+1和right=mid-1,没有+1,-1不可以吗?           else if(nums[mid]<nums[left]){//mid在右半部分,即mid右边是有序的                if(target>nums[mid]&&target<=nums[right]) left=mid+1;//若target在右边则向左边找                else right=mid-1;            }                        else {//没有rotate                if(target>nums[mid]) left=mid+1;                else right=mid-1;            }        }                return -1;    }};

81就是加上duplicates的情况

在上一题的基础上加上判断nums[left]==nums[mid]==nums[right]的条件即可。

因为有duplictaes的情况只会影响到当nums[left]==nums[mid]时,前半部分不是有序的,(i.e. 3123333)而出现这种情况时,我们可以得到保证nums[mid]==nums[right]

因此判断nums[left]==nums[mid]&&nums[right]==nums[mid],直到left和right更新到不符合条件就可以了。

class Solution {public:    bool search(vector<int>& nums, int target) {        int left=0,right=nums.size()-1,mid;        while(left<=right){            mid=(left+right)/2;            if(nums[mid]==target) return true;                        if(nums[left]==nums[mid]&&nums[right]==nums[mid]) {left++;right--;}                        else if(nums[mid]>nums[right]){                if(target>=nums[left]&&target<nums[mid]) right=mid-1;                else left=mid+1;            }                        else if(nums[mid]<nums[left]){                if(target>nums[mid]&&target<=nums[right]) left=mid+1;                else right=mid-1;            }                        else {                if(target>nums[mid]) left=mid+1;                else right=mid-1;            }        }                return false;    }};


0 0
原创粉丝点击