剑指offer_【6】旋转数组的最小数字

1. 题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

2.解题思路

方法1:重头到尾遍历,找到数组的最小值,时间复杂度为O(N)

方法2:二分遍历查找

  • mid = low +(high-low)/2;

  • 需要考虑三种情况:

    • arr[mid] > arr[high],如[3,4,5,1,2]说明最小数字在mid的右边,缩小范围,low = mid+1;

    • arr[mid]<arr[high],如[1,2,3,4,5]说明最小数字在mid的左边,high = mid-1;

    • arr[mid] = arr[high],如[0,1,1,1,1]或者[1,1,1,0,1],一步步缩小范围,high = high-1;

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.ArrayList;
public class Solution {
public static int minNumberInRotateArray(int[] arr){

int low = 0;
int high = arr.length - 1;

while(low < high){
int mid = low + (high - low)/2;

if(arr[mid] > arr[high]){

low = mid + 1;

}else if(arr[mid] == arr[high]){

high = high - 1;
}else{
high = mid;

}
}
return arr[low];

}

}
文章目录
  1. 1. 1. 题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k