开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
题目
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
- 若旋转
4次,则可以得到[4,5,6,7,0,1,2] - 若旋转
7次,则可以得到[0,1,2,4,5,6,7]
输入: nums = [4,5,6,7,0,1,2]
输出: 0
解释: 原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
思路
这个是旋转数组,我们这里使用二分法进行查找,通过二分法不断的把中间值和其他值进行做对比,最后得出最小值将其返回出去,我们先判断一下nums数组的长度是不是等于1,等于1说明数组中只有一位数,我们也没有必要执行查找最小值的操作,直接将nums数组中的第一位数返回即可,如果nums数组的长度不等于1,我们往下声明两个变量,分别是start变量和end变量,它们两个代表开始值和结束值,然后进行循环,在循环中我们声明一个mid变量,他的值为start和end的中间值,然后判断nums数组的mid位置值是否大于nums数组end的值,如果大于则说明nums数组的mid值到nums数组的end值的是递减的,所以最小值是在nums数组中mid位置的右边,如果不满足则继续往下判断,判断当前nums数组的mid位置的值是否小于nums数组end位置的值,如果满足,则说明nums数组mid位置的值到nums数组end位置的值是递增的,所以最小值是在nums数组mid位置的左边,然后在将其返回出去即可
/**
* @param {number[]} nums
* @return {number}
*/
var findMin = function(nums) {
if(nums.length==1){
return nums[0]
}
let start = 0;
let end = nums.length - 1;
while(start < end) {
let mid = parseInt(start + (end - start) / 2);
if(nums[mid] > nums[end]) {
start = mid + 1;
}else if( nums[mid] < nums[end]) {
end = mid;
}
}
return nums[start];
};