LeetCode 33. 搜索旋转排序数组

Posted airfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 33. 搜索旋转排序数组相关的知识,希望对你有一定的参考价值。

题目描述:

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

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

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别

 

题目明确要求我们的时间复杂度是$log(n)$,所以很显然是想让我们使用二分查找。
1.判断是否有旋转;
2,没有旋转,就直接使用二分查找;
3,有旋转,用二分查找找旋转点然后分成两个区间使用二分查找
 技术图片
class Solution {
public:
    //找到旋转点
    int findC(const vector<int>& nums) {
        int a = 0, b = nums.size() - 1;
        int mid = (a + b) / 2;
        while (a != mid) {
            if (nums[mid] >= nums[0]) a = mid;
            else b = mid;
            mid = (a + b) / 2;
        }
        return a;
    }
    int search(vector<int>& nums, int target) {
        if (nums.size() == 0) return -1;
        if (nums.size() == 1) { if (target == nums.front())return 0; else return - 1; }

        int a, b;
        if (nums[0] >= nums.back()) {//有旋转
            int C = findC(nums);
            if (target >= nums[0] && target <= nums[C]) {
                a = 0, b = C;
            }
            else if (target >= nums[C + 1] && target <= nums.back()) {
                a = C + 1, b = nums.size() - 1;    
            }
            else return -1;
        }
        else {//没有旋转
            if (target >= nums[0] && target <= nums.back())
                a = 0, b = nums.size()-1;
            else
                return -1;
        }

        int mid = (a + b) / 2;
        if (nums[mid] == target) return mid;
        if (nums[mid + 1] == target) return mid + 1;
        while (a != mid) {
            if (nums[mid] > target) b = mid;
            else a = mid;
            mid = (a + b) / 2;
            if (nums[mid] == target) return mid;
            if (nums[mid + 1] == target) return mid + 1;
        }
        return -1;
    }
};

 

以上是关于LeetCode 33. 搜索旋转排序数组的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode33. 搜索旋转排序数组

Leetcode 33.搜索旋转排序数组

[leetcode] 33. 搜索旋转排序数组(Java)

leetcode[33. 搜索旋转排序数组]

LeetCode 33 搜索旋转排序数组

5-002-(LeetCode- 33) 搜索旋转排序数组