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 a sorted array 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.
思路:
二分查找
我的代码:
public class Solution { public int findMin(int[] num) { if(num == null || num.length == 0) return Integer.MAX_VALUE; int left = 0; int right = num.length - 1; while(left + 1 < right) { if(num[left] < num[right]) return num[left]; int mid = (left + right)/2; if(num[mid] > num[right]) { left = mid + 1; } else if(num[mid] < num[right]) { right = mid; } else { right--; } } if(num[left] > num[right]) return num[right]; else return num[left]; } }
学习之处:
- 今天连续做了四道二分查找的问题,easy medium,hard都有,对二分查找理解更加深刻了,想的多,写出来,总结出来才是理解问题的王道,随性的写代码往往建立不起一整套的体系。
- 对于Find Minimum此类题目,由于某些情况下left = mid or right = mid 所以为了防止死循环 需要while(left + 1 < right)
- 对于Search问题 while(left <= right) 即可遍历到所有的数据
- 对于Rotated问题,怎么rotated都可以用通过判断A[left] A[mid] A[right]三者数据的大小,判断左部分还是右部分,哪边是有序的。
- 对于含有Duplicate数据的问题,A[left] < A[mid] 肯定可以确定left --> mid是升序的,对于A[left] == A[mid]便无法判断了,所以此时需要Left++ 排除一些元素,但是这样以来,也就增加了时间复杂度。