LeetCode#153. Find Minimum in Rotated Sorted Array

  • 題目:將一個沒有重複元素的升序數組在某個pivot處翻轉,從翻轉後的數組中找出最小的元素
  • 難度:Medium
  • 思路:升序數組翻轉後,數組被分成兩部分,兩部分各自有序,因此可採用二分查找的思想,mid將數組分成左右兩部分AB,其中一部分必定有序,而且最小元素一定在無序的那一部分(前提是,數組是被翻轉過的);對於未翻轉的數組,可通過先判斷mid右側部分是否有序來得到最小元素。最後返回下標爲left的數組元素即可
  • 代碼:
public class Solution {
    public int findMin(int[] nums) {
        if(nums == null || nums.length == 0){
            return -1;
        }

        int len = nums.length;
        int left = 0;
        int right = len-1;
        while(left < right){
            int mid = left + (right-left)/2;
            if(nums[mid] < nums[right]){
                right = mid;
            }else if(nums[left] < nums[mid]){
                left = mid;
            }else if(nums[left] == nums[mid]){
                left = mid+1;
            }
        }
        return nums[left];
    }
}

Follow Up

  • 題目:數組中存在重複元素,找出翻轉後的數組中最小元素
  • 思路:因爲存在重複元素,所以在查找的過程中,當nums[mid]==nums[right]時,不能認爲最小元素不在mid左邊,因爲只能將查找範圍縮小在[left,right–]
  • 代碼:
public class Solution {
    public int findMin(int[] nums) {
         if(nums == null || nums.length == 0){
            return -1;
        }

        int len = nums.length;
        int left = 0;
        int right = len-1;
        while(left < right){
            int mid = left + (right-left)/2;
            if(nums[mid] < nums[right]){
                right = mid;
            }else if(nums[mid] > nums[right]){
                left = mid+1;
            }else if(nums[mid] == nums[right]){
               right--;
            }
        }
        return nums[left];
    }
}
發佈了184 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章