- 題目:將一個沒有重複元素的升序數組在某個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];
}
}