【发布时间】:2021-01-29 03:41:27
【问题描述】:
我在看this leetcode挑战:
假设一个按升序排序的数组在某个枢轴处旋转 你事先不知道的。
(即,
[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。找到最小的元素。
您可以假设数组中不存在重复项。
我找到了这个解决方案on repl.it:
function findMin(nums) {
if (nums.length === 1) { //Edge
return nums[0];
}
let left = 0, right = nums.length - 1 //Two pointers
if (nums[right] > nums[0]) { //Sorted array case
return nums[0];
}
while (left < right) { //Shifted unsorted array
const mid = Math.floor((left + right) / 2);
if (nums[mid] > nums[right]) left = mid + 1; //If midpoint is larger than last element, look right
else right = mid; //Else look left
}
return nums[left];
}
我的问题与以下行背后的逻辑有关:
if (nums[mid] > nums[right]) left = mid + 1;
我一直在尝试在纸上编写示例,但是有人可以解释为什么上面的行是正确的逻辑吗?是不是因为移位数组中所有最小的元素总是在数组的右边?
【问题讨论】:
标签: arrays algorithm binary-search