[分析] Find Minimum in Rotated Sorted Array是基础版,可用于打开基础思路,升级版是要考虑数组可能有重复元素。将题目中的case旋转多次找出思路,直接的思路是顺序遍历找到第一个非升序的元素,这种做法复杂度是O(N),优化的做法是每次通过比较中间元素和左边界元素来截掉一半元素。若nums[left] < nums[mid],说明左半边是升序,最小元素在右半边中,若nums[left] < nums[mid],说明最小元素在左半边,没有重复元素情况下每次总能截掉一半元素,因此复杂度是O(logN)。
有重复元素情况下,左右边界和中间元素均可能相等,这就导致我们无从判断最小元素在哪边,解决办法就是在这种情况下左边界移动一步直到和中间值不等或者相遇,最坏情况下为O(N).
不管是否有重复,如果当前考察的数组段nums[left-right],其nums[left] < nums[right]说明这段数组没有选中,nums[left]就是最小元素,一旦旋转nums[left] >= nums[right]。
循环只处理数组含三个元素以上的情况,若考察数组至多仅有两个元素,可比较确认最小元素。
重复元素处理思路参考Code Ganker博客,不理解他的实现中为什么需要维护min……
[ref]
[url]http://blog.youkuaiyun.com/linhuanmars/article/details/40449299[/url]
有重复元素情况下,左右边界和中间元素均可能相等,这就导致我们无从判断最小元素在哪边,解决办法就是在这种情况下左边界移动一步直到和中间值不等或者相遇,最坏情况下为O(N).
不管是否有重复,如果当前考察的数组段nums[left-right],其nums[left] < nums[right]说明这段数组没有选中,nums[left]就是最小元素,一旦旋转nums[left] >= nums[right]。
循环只处理数组含三个元素以上的情况,若考察数组至多仅有两个元素,可比较确认最小元素。
重复元素处理思路参考Code Ganker博客,不理解他的实现中为什么需要维护min……
[ref]
[url]http://blog.youkuaiyun.com/linhuanmars/article/details/40449299[/url]
public class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int left = 0, right = nums.length - 1;
int mid = 0;
while (right - left > 1) {
if (nums[left] < nums[right])
return nums[left];
mid = left + (right - left) / 2;
if (nums[left] < nums[mid]) {
left = mid + 1;
} else if (nums[left] > nums[mid]){
right = mid;
} else {
left++;
}
}
return nums[left] < nums[right] ? nums[left] : nums[right];
}
}