leetcode之Find Minimum in Rotated Sorted Array II 问题

问题描述:

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

The array may contain duplicates.

问题来源Find Minimum in Rotated Sorted Array II (详细地址:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/#/description)

思路:其实这道题是从Find Minimum in Rotated Sorted Array 问题进一步演化过来的,二分查找已经在前文当中介绍了,如果你对这方面还是不熟悉,可以参见Find Minimum in Rotated Sorted Array解答  。在这只介绍一下不同的地方:当nums[mid] == nums[high]的时候,我们不能确定最小值是在左边还是在右边,那我们就把high指针往左边移移肯定是没错的,因为求的是最小值嘛,移大的肯定是没问题的

代码:

leetcode之Find Minimum in Rotated Sorted Array II 问题

其实表面一看,好像是对的,其实还有有点不对的地方的。但是这道题的返回的答案是对的,问题出在哪里呢?

其实返回的索引有时候是不对的,参考下面的两个例子:
   1)1 1 1 1 1 1 1 1 2 1 1  总共11个数,索引从0 ~ 10,正确结果的索引应该是9,而折半查找分析出来的结果是0;
   2)2 2 2 2 2 2 2 2 1 2 2  这道题返回的是最小值1,索引当然就只有8了;


 为什么会出现上面的索引不对的这种情况呢?

因为当你的指针high--的时候,直接就跳过了mid所指向的值。接着分析第一个例子,当high指向2的时候,直接就跳到前半部分去了,所以返回的索引值是不对的。其实只需要稍微修改一下代码就可以避免发生这种错误了,加一个if判断即可。

修改代码:

leetcode之Find Minimum in Rotated Sorted Array II 问题