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.算法
「查找旋轉排序的數組最小值」的後續:容許重複元素,可是兩個字數組依然局部有序。數組
採用類二分搜索算法進行查找this
算法實現類spa
public class Solution { public int findMin(int[] nums) { // 參數校驗 if (nums == null || nums.length < 1) { throw new IllegalArgumentException(); } int lo = 0; int hi = nums.length - 1; int mid = 0; // 能夠排除數組全局有序的狀況 while (nums[lo] >= nums[hi]) { // 若是隻有兩個元素,返回後一個 if (hi - lo == 1) { mid = hi; break; } mid = lo + ((hi - lo) >> 1); if (nums[mid] == nums[lo] && nums[mid] == nums[hi]) { // 只能採用順序搜索方法,不能採用lo++,hi--的方式 // 由於lo多是前一個有序數組的最後一個 // hi也多是後一個有序數組的第一個 return sequenceSearch(nums, lo, hi); } // 若是mid在前一個有序數組中 if (nums[mid] >= nums[lo]) { lo = mid; } // 若是mid在後一個有序數組中 else if (nums[mid] <= nums[hi]) { hi = mid; } } return nums[mid]; } /** * 順序搜索數組中的最小值,nums是由有序數組按某個軸旋轉得來的 * * @param nums 搜索數組 * @param start 開始位置 * @param end 結束位置 * @return 最小值 */ public int sequenceSearch(int[] nums, int start, int end) { for (int i = start; i < end; i++) { if (nums[i] > nums[i + 1]) { return nums[i + 1]; } } return nums[start]; } }