问题描述:
二分查找,有序翻转后的数组上进行查找 ,返回下标。
问题分析:
这题关键在于找到一个性质,就是如果这个数组确实被翻转过,那么 一定有a[0] > a[n],所以根据这个条件来判断,当前l r 是否在单调区间上。
问题解决:
首先判断target所在区间,然后判断m所在区间,最后先将l 或者 r 往target区间上靠, 然后把m往target上靠。
代码如下:
class Solution { public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1, m; while(l <= r){ m = (l + r)>>1; if(nums[m] == target) return m; if(nums[l] <= nums[r]){ if(nums[m] < target) l = m + 1; else r = m - 1; }else{ if(target >= nums[l]){//target在左侧区间 if(nums[m] < nums[r])//m在右侧区间 r = m - 1;//让m 左移 else{// m在左侧区间 if(nums[m] > target) r = m - 1; else l = m + 1; } } else{//target在右侧区间 if(nums[m] > nums[r])//m在左侧区间 l = m + 1;//让m 右移 else{//m在右侧区间 if(nums[m] > target) r = m - 1; else l = m + 1; } } } } return -1; } };