看到题目写的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 };