1. 程式人生 > >【LeetCode-面試演算法經典-Java實現】【154-Find Minimum in Rotated Sorted Array II(找旋轉陣列中的最小數字II)】

【LeetCode-面試演算法經典-Java實現】【154-Find Minimum in Rotated Sorted Array II(找旋轉陣列中的最小數字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[] 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]; } }

評測結果

  點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。

這裡寫圖片描述

特別說明