有重复元素情况下,左右边界和中间元素均可能相等,这就导致我们无从判断最小元素在哪边,解决办法就是在这种情况下左边界移动一步直到和中间值不等或者相遇,最坏情况下为O(N).
不管是否有重复,如果当前考察的数组段nums[left-right],其nums[left] < nums[right]说明这段数组没有选中,nums[left]就是最小元素,一旦旋转nums[left] >= nums[right]。
循环只处理数组含三个元素以上的情况,若考察数组至多仅有两个元素,可比较确认最小元素。
重复元素处理思路参考Code Ganker博客,不理解他的实现中为什么需要维护min……
[ref]
http://blog.csdn.net/linhuanmars/article/details/40449299
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]; } }