码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-04-27 17:36:18      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:查找   旋转   数组   答案   代码量   判断   序列   ems   search   

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;
    }
};

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

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

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

标签:查找   旋转   数组   答案   代码量   判断   序列   ems   search   

原文地址:https://www.cnblogs.com/Beic233/p/12787803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!