原题链接
解法一
01 思路
暴力枚举, 在原来的数组中,最小的元素就是第一个数。
将数组开始的一个区间中的元素搬运到后面,现在整个序列就是具有二段性,可以分为两个部分,并且这个两个部分内部都是升序的。
遍历整个序列,如果说后面一个数比前面一个数小,就说明找到了分界点
时间复杂度为:O(n)
02 代码
class Solution {
public int minArray(int[] numbers) {
int l = 0;
int r = numbers.length - 1;
for(int i = l; i < r; i++) {
if(numbers[i] > numbers[i+1]) return numbers[i+1];
}
return numbers[l];
}
}
解法二
01 思路
二分,在解法一中,我们说到修改过后的序列具有二段性,我们可以二分出这个分界点
02 代码
class Solution {
public int minArray(int[] numbers) {
int l = 0;
int r = numbers.length - 1;
// 去重
while(l < r && numbers[r] == numbers[0]) r--;
// 没有进行修改
if(numbers[r] >= numbers[l]) return numbers[l];
// 二分边界
while(l < r) {
int mid = l + r >> 1;
if(numbers[mid] < numbers[0]) r = mid;
else l = mid + 1;
}
return numbers[l];
}
}