力扣
解题报告:
二分。但是有不少细节要考虑清楚。
所以干脆考虑另一种二分的方式。也就是第二次二分的时候,把两半数组给拼成一个完整的数组,当然下标需要是虚拟的,这一步可以用偏移量+取模完成。这样就不需要考虑边界情况了。
class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();int l = 0, r = n-1;int mid, tar=n;//这里的细节,因为有可能进不到tar=mid那里while(l<=r) {mid = (l+r)/2;if(nums[mid] < nums[0]) {//这里的细节,不能是<=tar = mid;r = mid-1;} else {l = mid+1;}}if(tar == 0) tar = n;//这里的细节,保证一致。if(target >= nums[0]) {l = 0, r = tar-1;} else {l = tar, r = n-1;}while(l<=r) {int mid = (l+r)/2;if(nums[mid] > target) r = mid-1;else if(nums[mid] < target) l = mid+1;else return mid;} return -1;}
};