Search in Rotated Sorted Array

看到题目写的hard,感觉走一边数组就可以了嘛

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) {
 4         for(int i=0;i<nums.size();i++)
 5         {
 6             if(nums[i]==target) return i;
 7         }
 8          return -1;
 9     }
10 };

   以上时间是4ms.  

   还是觉得莫名其妙,被leetcode吓怕了,总觉得题目不会这么简单。

  看了下网上的解答,发现大家重点在复杂度上,而上面的复杂度为O(n)。

   下面是复杂度为O(log N)

序列:0 1 2 3  4 5 6 7 8

情况一:0在中间点左边

如:6 7 8 0 1 2 3 4  5       ;1是中间点,此时中间值小于最右边的值

情况二:0在中间点右边

如:3 4 5 6 7 8 0 1 2       ;7是中间点,此时中间值大于最右边

注意:上面的想法是基于序列是升序排列,若是降序,没有旋转的请款包含在情况二中,其它的则要颠倒

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) {
 4     if(nums.size()<=0) return -1;
 5      int low=0,high=nums.size()-1;
 6      int mid,rot,remid;
 7      while(low<high)
 8      {
 9          mid=(low+high)/2;
10          if(nums[mid]<nums[high]) high=mid;
11          else low=mid+1;
12      }
13      rot=low;
14      low=0;high=nums.size()-1;
15      while(low<=high)
16      {
17          mid=(low+high)/2;
18          remid=(mid+rot)%nums.size();
19          if(nums[remid]==target) return remid;
20          else if(nums[remid]<target) low=mid+1;
21          else high=mid-1;
22      }
23      return -1;
24     }
25 };
原文地址:https://www.cnblogs.com/daocaorenblog/p/5268295.html