题目描述
假设一个按照升序排列的有序数组从某个未知的位置旋转。(比如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2)。
找到其中最小的元素。
你可以假设数组中不存在重复的元素。
解题思路
如果这个升序排序的有序数组确实按照某个未知的位置旋转,只有两种可能:
1.a [mid] > a [left] && a [mid]> a [right],所以,mid位于较大的那部分,较小的部分位于mid右边,应该向右走;
2.a [mid] <a [left] && a [mid] <a [right],所以,mid位于较小的那部分,为了找到最小的元素,应该向左走;
如果这个数组没有旋转(或者是循环旋转完),只需要往左走,a[mid]总是< a[right];
结论:mid > right,向右走;mid < right,向左走;
public int findMin(int[] nums) {
if (nums==null || nums.length==0) {
return Integer.MIN_VALUE;
}
int left = 0, right = nums.length-1;
while (left < right-1) {
int mid = left + (right-left)/2;
if (nums[mid] > nums[right]) { left = mid; }
else { right = mid; }
}
if (nums[left] > nums[right]) {
return nums[right];
}
return nums[left];
}//更推荐这个答案
public int findMin(int[] nums) {
int left = 0,
right = nums.length - 1,
mid = 0;
while(left < right){
mid = (left + right) >> 1;
if(nums[mid] > nums[right]) left = mid + 1;
else right = mid;
}
return nums[right];
}

本文介绍了一种在已知升序数组被未知旋转后寻找最小元素的方法。通过二分查找法,判断中间元素与右侧元素的关系来确定搜索方向,最终找到最小值。提供两种实现方式。
281

被折叠的 条评论
为什么被折叠?



