题目
难点在于可能拥有重复元素。
解题
相似题目:
题目 | 解题 |
---|---|
153. 寻找旋转排序数组中的最小值 | 解题 |
33. 搜索旋转排序数组 | 解题 |
154. 寻找旋转排序数组中的最小值 II 、剑指 Offer 11. 旋转数组的最小数字 | 解题 |
解题一:暴力遍历
// javascript
var findMin = function(nums) {
let minVal = Number.MAX_VALUE;
for (let i = 1; i < nums.length; ++i) {
if (nums[i] < nums[i - 1]) {
minVal = nums[i];
break;
}
}
return minVal === Number.MAX_VALUE ? nums[0] : minVal;
};
解题二:二分查找
没有重复数组的情况:分界点是第二个有序数组的第一个元素
mid指向的元素在第一个有序数组中,分界点在它后面:
mid指向的元素在第二个有序数组中,分界点是它或者在它前面:
没有重复数组的情况:如果出现 numbers[mid] == numbers[right] 的情况,无法确定分界点在哪一半,采取从右向左暴力遍历的方式。
[4, 3, 4, 4, 4]
[4, 4, 4, 0, 4]
// javascript
var findMin = function(nums) {
const n = nums.length;
let left = 0, right = n - 1;
while (left < right) {
const mid = left + ((right - left) >> 1);
if (nums[mid] < nums[right]) {
right = mid;
} else if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right--; // nums[mid] === nums[right], 无法二分,暴力缩小范围
}
}
return nums[left];
};
解决两个问题:
寻找旋转排序数组中的最小值 II