Leetcode 81. 搜索旋转排序数组 II C++

Leetcode 81. 搜索旋转排序数组 II

题目

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

测试样例

1.
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
2.
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

题解

二分查找
方法比较暴力,先把数组中中间的数和前面都一样就略掉,同时如果中间的数和后面都一样也略掉。之后便可以二分了,因为这种过滤方法会把旋转后最前面到中间和最后面一致的这种可能过略掉。
之后便是二分查找,先确定目标数在旋转点的那个区间上,详细过程见代码

代码

bool search(vector<int>& nums, int target) {
        if(nums.empty())    return false;
        int i=0,j=nums.size()-1,mid;
        mid = (i+j)/2;
        if(nums[mid] == target) return true;
        else if(mid != i && nums[i]==nums[mid]){
            i=mid+1;
            while(i<=j && nums[i]==nums[mid])   i++;
            if(i == nums.size()){
                i=0;
                j=mid-1;
                while(i<=j && nums[j]==nums[mid])   j--;
            } 
        }
        while(i<=j){
            mid = (i+j)/2;
            if(nums[mid] == target) return true;
            else if(nums[mid]>=nums[i]){	//i~mid在旋转点的左边,即i~mid是递增的
                if(target>=nums[i] && target<nums[mid]){		
                    j=mid-1;
                    while(i<=j && nums[j]==nums[mid])   j--;
                }else{
                    i=mid+1;
                    while(i<=j && nums[i]==nums[mid])   i++;
                }
            }else{					//mid~j在旋转点的右边,mid~j是递增的
                if(target>nums[mid] && target<=nums[j]){
                    i = mid+1;
                    while(i<=j && nums[i]==nums[mid])   i++;
                }else{
                    j=mid-1;
                    while(i<=j && nums[j]==nums[mid])   j--;
                }
            }
        }
        return false;
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(Leetcode 81. 搜索旋转排序数组 II C++)