【LeetCode-面試演算法經典-Java實現】【154-Find Minimum in Rotated Sorted Array II(找旋轉陣列中的最小數字II)】
阿新 • • 發佈:2019-01-05
原題
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[] 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];
}
}
評測結果
點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。