1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 原 array:[0, 1, 2, 4, 5, 6, 7] rotate 之后就是:[4, 5, 6, 7, 0, 1, 2] 输出:最小值 0
1. 遍历所有值,用一个变量记录最小值 2. 二分查找(每次排除一半数据,留下另一半再进行对比)
example: arr = [4, 5, 6, 7, 0, 1, 2];
1. 中间值和最右边值进行对比, 如果中间值大于最右边值则认为最小值在右边区域。 left = middle + 1 (+1因为right > middle) 2. 中间值和最右边值进行对比, 如果中间值小于最右边值则认为最小值在左边区域。 right = middle (最小值可能是middle本身) 3. while终止条件: left == right
const findMin = function (arr = []){ if(arr.length <= 0){ return -1; } let left = 0; let right = arr.length - 1; while(left < right){ let middle = left + Math.floor((right - left) / 2); if(arr[middle] > arr[right]){ left = middle + 1; } else if (nums[mid] == nums[right]){ right --; } else{ right = middle; } } return arr[left]; } findMin([4, 5, 6, 7, 0, 1, 2]);
|