一、问题描述
- 给定一个旋转数组
- 旋转数组是数组某个点左边的数全比右边的数大,且两部分均有序。例如{3,4,5,1,2}
- 求数组的最小值
二、思路以及Code
1、思路
- 直接遍历数组则时间复杂度为O(n)并非最优。
- 这种题明显想到二分法
- 首先设定两个索引,分别位置为最左和最右,indL和IndR
- 每次寻找indL和indR的中间索引mid
- 若该数值比nums[0]小则应该把indR向左移动到mid
- 反之移动indL到mid
- 重复上述步骤一直到最小值和最大值逼近至索引位置差1
2、Code
1 package algorithm; 2 3 /** 4 * Created by adrian.wu on 2019/3/26. 5 */ 6 public class RoatedArray { 7 public int min(int[] nums) { 8 int indL = 0, n = nums.length, indR = n - 1; 9 while (indR - indL > 1) { 10 int mid = (indR + 1 + indL) / 2; 11 if (nums[mid] > nums[0]) indL = mid; 12 else indR = mid; 13 } 14 return nums[indR]; 15 } 16 }