leetcode 33搜索旋转排序数组

主要考察的还是二分查找问题。

这里的二分查找你可以写两个,也可以写一个。

一、如果说要写两个while的循环进行二分查找,那么第一个循环一般就是用来找那个旋转位置的,然后再根据旋转位置,选择你要查找的数的范围。所以我们用二分查找来进行查找你所定位到的区间。这里leetcode上的题解已经说的非常详细了,所以我就不在这里赘述了。

二、如果说需要写一个,那么也就是在这一个while循环里判断条件,也就是 if else 语句。

如果非要分析,也就是说,在两个区间里面一定有一个是从小到大排序的。而且这里作者也想告诉各位二分的一个性质,二分不仅仅是来查找元素的,其实在某点区域里,如果它满足一个性质,而另一个区域是不满足一个性质的,那么这个时候你就可以用二分查找的思想进行思考,这也是一个本质所在。

那么既然知道了一个区间是有序的,一个区间是无序的,那么怎么判断区间是有序还是无序呢?我们从题目上知道,这个所谓的旋转数组其实际上就是把后面的数提到了前面来,也就是说,前面那一部分的元素都是大于后面一部分的元素的,所以我们可以根据旋转数组的第一个元素nums[0]和你在二分查找中找到的nums[mid]进行比较,如果说nums[mid]>nums[0],那么也就是说,这一区间的元素就是有序的那一部分数组,否则就是无序的。

判断完这两部分区间的元素之后,我们再来看我们需要查找的目标元素是否在这些数组里面,那么就需要对这两个区间进行比较了。如果说在有序的数组里面,直接常规二分查找,判定条件写出来就可以;如果说是无序的那一部分,你需要判断它在中间,还是端点,还是在里面。

上代码:

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

你可能感兴趣的:(leetcode,算法,c++,c语言)