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

Posted arctic_fox

tags:

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

1. 题目

2. 解法

3. 总结

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

leetcode33. 搜索旋转排序数组

刚开始我的思路是先遍历直到发现断层,如果有与target一样的值就直接返回,否则就对断层的地方一直到最后进行二分查找。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int ans = -1,pos = 0,n = nums.size();
        for(int i = 0; i < n; i++){
            if(nums[i] == target) return i;
            if(i != n - 1 && nums[i] > nums[i+1]) {pos = i+1; break;}
        }
        n = n-1;
        while(pos <= n){
            int mid = (pos+n)/2;
            if(nums[mid] == target) {ans = mid; break;}
            if(nums[mid] < target) pos = mid+1;
            if(nums[mid] > target) n = mid-1;
        }
        return ans;
    }
};

但这样的最坏复杂度还是O(n)的,看了答案才知道像这样有只有一个断层的序列也能直接用二分.

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

而且题解中有一个代码量非常少的答案,思路和二分一样,只不过运用一些数学的判断让代码变得很简洁

总结:排好序的数组可以用二分查找,只有一个排序断层的数组也能直接用二分进行查找!

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

leetcode33 搜索旋转排序数组(Medium)

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

LeetCode33. 搜索旋转排序数组

LeetCode 33 搜索旋转排序数组

Leetcode 33.搜索旋转排序数组

LeetCode 33 搜索旋转排序数组