隨筆-尋找旋轉排序陣列中的最小值(無重複數字)
阿新 • • 發佈:2018-12-28
題目:
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
請找出其中最小的元素。
你可以假設陣列中不存在重複元素。
示例 1:
輸入: [3,4,5,1,2]
輸出: 1
示例 2:
輸入: [4,5,6,7,0,1,2]
輸出: 0
思路:如果陣列是排序陣列,那麼第一個元素是小於最後一個元素的,如果是排序後的旋轉陣列,那麼第一個元素肯定是大於最後一個元素。 我們可以通過最普通的查詢方法,時間複雜度為O(n), 但是用二分法進行查詢,時間複雜度是普通方法的一半;排序後的旋轉陣列有一個特點,那就是前半部分有序陣列是大於後半部分的。所以,如果nums[mid] 在第一部分 執行if nums[mid]>nums[end] 那麼最小元素肯定在nums[mid]後面。 如果在第二部分,執行else 。
class Solution { public int findMin(int[] nums) { if(nums==null){ return 0; }else if(nums.length==1 || nums[0]<nums[nums.length-1]){ return nums[0]; } int start=0; int end=nums.length-1; int mid=(start-end)/2; while(start<end){ mid=(start+end)/2; if(nums[mid]>nums[end]){ start=mid+1; }else{ end=mid; } } return nums[start]; } }