LeetCode 33 Search in Rotated Sorted Array

来源:互联网 发布:java web truelicense 编辑:程序博客网 时间:2024/05/17 01:20

题意:

一个数字环,它里面的数字是递增排序的,现在从任意位置把它截断成序列,问target是否在环中出现。


思路:

一定能想到二分查找,但是这个序列并不是有序的。不过我们仍然可以创造一种二分的方式,毕竟二分的精髓是每次丢掉一般的候选集合。方法如下:

1.如果当前区间的中间值是答案,则找到答案。

2.如果当前区间是递增的,那么和平时我们写的二分查找就一样了。不详细展开了。

3.中间值将区间分成两部分,其中至少有一部分是递增的。因此只需要判断target是否在递增的那一段中即可,若在则丢掉另一半,否则丢掉这一半。


代码:

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


0 0