
- 暴力解法直接使用for循环遍历,但是很明显不是面试官要的
- 使用二分查找法
将数组的最右边的元素当作target进行比较
当arr[mid] > target,此时很明显目标值在mid之后,并且不可能是arr[mid],所以l=mid+1
当arr[mid] < target,此时很明显目标值在mid之前,并且可能是arr[mid],所以r = mid
当arr[mid] = target,
- 如果是 1 0 1 1 1, arr[mid] = target = 1, 显然答案在左边
- 如果是 1 1 1 0 1, arr[mid] = target = 1, 显然答案在右边
所以这种情况,不能确定答案在左边还是右边,那么就让r =r - 1;慢慢缩少区间,同时也不会错过答案。
**public class Solution {public int minNumberInRotateArray(int [] array) {if(array.length == 0)return 0;int l = 0, r = array.length-1;while(l < r){if(array[l] < array[r]){ //没有旋转或者理解为全部旋转,相当于原数组return array[l];}int mid = l + (r-l)/2;if(array[mid] < array[r]){r = mid;}else if(array[mid] > array[r]){l = mid+1;}else {--r;}}return array[l];}}
