> 文档中心 > 剑指Offer 11.选择数组中的最小数字

剑指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];    }}