leetcode-Search in Rotated Sorted Array-33

一个有序的序列,可能右移了一定长度,求target在这个右移后的序列中的位置

直观做法:遍历一遍,但这题肯定原意不是这个

正解:二分,因为这个序列其实局部还是有序的

1.如果nums[l]<nums[mid]说明[l,mid]区间是有序的:

  1)如果target>=nums[l]且target<=nums[mid],说明target在这个区间,则r=mid-1收缩

  2)否则说明target不在这个区间,则l=mid+1收缩

2.如果nums[l]>nums[mid]说明这个区间正好包括了序列右移之前的首尾,一定是这个样子的:678123

  1)如果target>=nums[l]或target<=nums[mid],说明target在这个区间,则r=mid-1收缩

  2)否则说明target不在这个区间,则l=mid+1收缩

3.注意nums[l]==nums[mid]的情况,此时l++

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) {
 4         if(nums.size()==0) return -1;
 5         int l=0,r=nums.size()-1;
 6         while(l<=r){
 7             int mid=(l+r)>>1;
 8             if(nums[mid]==target) return mid;
 9             if(nums[l]<nums[mid]){
10                 if(nums[l]<=target&&target<=nums[mid]) r=mid-1;
11                 else l=mid+1;
12             }
13             else if(nums[l]>nums[mid]){
14                 if(target>=nums[l]||target<=nums[mid]) r=mid-1;
15                 else l=mid+1;
16             }
17             else l++;
18         }
19         return -1;
20     }
21 };

 

posted @ 2016-08-31 11:40  0_summer  阅读(117)  评论(0编辑  收藏  举报