剑指Offer 11.选择数组中的最小数字
原题链接
解法一
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]; }}