看到题目还在想,这题还用考吗?直接 array.sort().shift() 不就解决了。其实还要从时间复杂度的方向去考虑问题,另外,直接用api,确定面试官不会把你赶出去吗??题目要求用旋转数组的特性,其实这道题主要考察二分查找,用二分查找的方法去找到数组中的最小元素。
题目描述
解题思路
数组旋转后可以划分为是两个排序的子数组,前面元素都大于或者等于后面子数组元素,并且最小的元素正好是两个子数组的分界点,给出的数组在一定程度上也是排序的,所以可以用二分查找O(logN)来实现。
解题步骤
- 设置low,high,代表首尾连个指针;
- 获取中间元素mid,判断mid和尾指针的大小;
- 如果mid大于high,说明最小值在后区,low=mid+1;
- 如果mid小于high,说明最小值在前区,high=mid;
- mid等于high,直接high–。
Coding
var minArray = function(numbers) {
if(!numbers.length) return 0;
let low = 0;
let high = numbers.length - 1;
while(low < high){
const mid = Math.floor((low + high) / 2);
if(numbers[mid] > numbers[high]){
low = mid + 1;
}else if(numbers[mid] < numbers[high]){
high = mid;
}else{
high--
}
}
return numbers[low];
}