图解
代码
class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length < 1) return -1;
// 二分找pivot, 这里用性质>=nums[0], 所以当找到边界时, 它将是最后一个比nums[0]大的数
int l = 0, r = nums.length-1;
while(l < r){
int mid = l + r + 1 >> 1;
if(nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
// 确定target在哪一段中
if(target >= nums[0]) {l = 0;}
else {l = r+1; r = nums.length-1;}
// 二分找目标值
while(l < r){
int mid = l + r + 1 >> 1;
if(target >= nums[mid]) l = mid;
else r = mid - 1;
}
// 这里写成nums[r], 当数组只有一个元素时, 两个二分查找代码都没有走, 而l在上面被+1, 这时会越界, 而r是length-1还是0, 不会产生越界
if(nums[r] == target) return l;
else return -1;
}
}
pivot应该是7,不是0
不是只有一个元素的问题,两个元素你写nums[l]一样WA
牛的,做个返回r很经验主义。
对越界的阐述很清楚,感谢!
if(nums[r] == target) return l;
解释的非常好~
用啥写的啊?
这一看ipad加onenote,用啥写不重要,前提自己字要好看,不然写出来一坨屎
字好看!