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