目录
题目


代码
题号33搜索旋转排序数组的前置题吧感觉是。
设 x=numsmid 是现在二分取到的数。
把 x 与最后一个数 numsn−1 比大小:
- 如果 x>numsn−1,那么可以推出以下结论:
- nums 一定被分成左右两个递增段;
- 第一段的所有元素均大于第二段的所有元素;
- x 在第一段。
- 最小值在第二段。
- 所以 x 一定在最小值的左边。
- 如果 x≤numsn−1,那么 x 一定在第二段。(或者 nums 就是递增数组,此时只有一段。)
- x 要么是最小值,要么在最小值右边。
js
/**
* @param {number[]} nums
* @return {number}
*/
var findMin = function(nums) {
let l = 0, r = nums.length - 1;
while (l <= r) {
let mid = Math.floor((l + r) / 2);
if (nums[mid] > nums[nums.length - 1]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return nums[l];
};
补充
自己写的时候最后 return nums[l] 其实是通过样例找规律出来的,并没有做很严格的边界推理,问了d老师改了一版更标准的写法供参考学习:
js
var findMin = function(nums) {
let left = 0, right = nums.length - 1;
while (left < right) { // 循环结束条件:left == right
const mid = Math.floor((left + right) / 2);
if (nums[mid] > nums[right]) { // 最小值在 mid 右侧
left = mid + 1;
} else { // 最小值在 mid 或 mid 左侧
right = mid;
}
}
return nums[left]; // 或者 nums[right]
};