码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 33. Search in Rotated Sorted Array

时间:2020-04-04 00:17:58      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:最大值   search   割点   com   arc   nbsp   cpp   出现   分割   

https://leetcode.com/problems/search-in-rotated-sorted-array/

解法一:本来有序的数组经过rotate后,分成了两部分。以最大值为分割点。通过二分搜索找最大值。然后在[0 , maxi] , 和[maxi + 1 , nums.size()-1]两部分分别进行二分搜索,时间复杂度为o(logn)

 

解法二:https://leetcode.com/problems/search-in-rotated-sorted-array/discuss/14425/Concise-O(log-N)-Binary-search-solution

参考大神的解法,实在是比较巧妙的方法,将两部分统一成一个部分;找到rotate了多少步,也就是找最小值的index。

找到最小值的index后,在rotate前的数组中进行二分搜索,找到rotate后的index,与target进行比较

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        if(nums.empty()) return -1 ;
        
        int l = 0 , r = nums.size() - 1 , mini , len = nums.size();
        
        while(l < r)
        {
            int mid = l + (r - l) / 2; 
            
            if(nums[mid] > nums[r]) l = mid + 1 ;
            else r = mid ;
        }
        mini = l ;
        
        l = 0 ;
        r = nums.size() - 1 ;
        
        while(l <= r)
        {
            int mid = l + (r - l) / 2 ;
            int realm = (mid + mini) % len ;
            
            if(nums[realm] < target) l = mid + 1 ;
            else if(nums[realm] > target) r = mid - 1 ;
            else return realm ;
        }
        return -1 ;
    }
};

  

重点:if中的语句应该是nums[mid] > nums[r] 而不是 nums[mid] > nums[l],这是因为如果rotate步数为0, 当nums[mid] > nums[l]最小值可能出现在左边

        while(l < r)
        {
            int mid = l + (r - l) / 2; 
            
            if(nums[mid] > nums[r]) l = mid + 1 ;
            else r = mid ;
        }
        mini = l ;

leetcode 33. Search in Rotated Sorted Array

标签:最大值   search   割点   com   arc   nbsp   cpp   出现   分割   

原文地址:https://www.cnblogs.com/mychen06/p/12629561.html

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