原题链接
一道简单题,求旋转数组的最小值。
无疑二分法是比较容易想到的。
使用了递归结构容易理解,不同很多额外的判断。
当然这种解法实际上没有利用旋转数组的特点,对于一般数组也是适用的。
技巧性的东西就是在判断搞下标的时候用了取余防止溢出。
时间复杂度是O(log n),空间复杂度是O(n)
int minArray(int* numbers, int numbersSize){
if(numbersSize == 1) return *numbers;
if(numbersSize == 2) return *numbers < *(numbers + 1) ? *numbers : *(numbers + 1);
int left = 0, right = numbersSize - 1;
int ml, mr;
if(left <= right){
int mid = (left + right)/2;
// 这里的下标要对数组长度取余,不然会有溢出
if(numbers[mid] < numbers[(mid + 1) % numbersSize] && numbers[mid] < numbers[(mid - 1)%numbersSize]) return numbers[mid];
else{
ml = minArray(numbers, mid - left);
mr = minArray(numbers + mid + 1, right - mid);
}
}
return ml < mr ? ml : mr;
}
当然非递归形式的写法也比较好,参考官方的解答,其中的 high -= high 处理 numbers[low] 和 numbers[high] 相等的情况。运行结果显示,递归时间更短。