难度:简单
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例:
输入:[3,4,5,1,2]输出:1
解题思路:
var minArray = function(numbers) {let min = numbers[0];for(let i of numbers){min = Math.min(i, min)}return min};
旋转后的数组可以划分为两个有序的子区间,前面区间的元素都大于等于后面的元素,我们要找的就是两个子区间的分界
很自然想到二分查找
nums[mid] > nums[right]
最小元素肯定在mid的右边,所以 left = mid + 1
nums[mid] == nums[right]
此时 mid 可能处于左边的增区间,也可能处于右边的增区间,即最小元素不确定在它的左边还是右边
所以 right— ,换一个 nums[right] 再试
nums[mid] < nums[right]
此时 mid 肯定处在右边的增区间,所以 right = mid
const minArray = (nums) => {let left = 0;let right = nums.length - 1;while (left < right) {const mid = left + ((right - left) >>> 1);if (nums[mid] > nums[right]) {left = mid + 1;} else if (nums[mid] == nums[right]) {right--;} else {right = mid;}}return nums[left];};
