题解 | #JZ6旋转数组的最小数字#
旋转数组的最小数字
http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
考察特殊的 二分查找
题干中有一个概念没有理解,导致想不明白题意:
非递减数组, 意思是:数组中没有任何部分是递减的! 122344
非递减数组的旋转,就是将后边一部分元素挪到了前面,导致原本处在第一位的最小元素去到中间了。
题目要找到并输出这个最小元素。
查找元素嘛, 二分查找法适用。
但是最小元素不知道,没有一个 target 去和 mid元素比。
其实也是可以做的,将某个端点值设为target即可。
而这个端点值不能随便选,一般选后面的。 可以在纸上做一下演草。
情况1 :1 2 3 4 5 , arr[mid] = 3. target = 1, arr[mid] > target, 答案在mid 的左侧
情况2 :3 4 5 1 2 , arr[mid] = 5, target = 3, arr[mid] > target, 答案却在mid 的右侧
所以不能把左端点当做target
public class Solution { public int minNumberInRotateArray(int [] array) { if (array.length==0) return 0; int low =0; int high = array.length-1; int mid = 0; while(low<high){ if(array[low]<array[high]) return array[low]; mid= low + ((high-low)/2);//mid 取值要这么取,防止int越界。 // 二分查找常用于查找一个数target,当没有一个target的时候,可以选择一个端点值作为target。 if(array[mid]>array[high]) low=mid+1; else if (array[mid]<array[high]) high=mid; else --high; } return array[low]; }