153. Find Minimum in Rotated Sorted Array

class Solution {
    public int findMin(int[] nums) {
      if(nums == null || nums.length == 0){
        return 0;
      }
      
      if(nums.length == 1){
        return nums[0];
      }
      
      int start = 0;
      int end = nums.length - 1;
      while(start < end){
        int mid = start + (end - start) / 2;
        if(nums[mid] < nums[end]){
          end = mid;
        }else{
          start = mid + 1;
        }
      }
      return nums[start];
    }
}
先找出哪一段是sorted, 然后再根据这个去unsorted 的那部分找 min. 
找 target 那道题是 先找出哪一段是sorted, 然后先看 target 在不在 sorted的 那一部分, 如果在, 就根据那一段继续二分, 如果不在, 去 unsorted 的那一段 二分去找。 
 
这俩个题的共同点是先判断哪一段 是 sorted 
 
 
原数组:0 1 2 4 5 6 7
情况1:  6 7 0 1 2 4 5   
情况2:  2 4 5 6 7 0 1  
(1) A[mid] < A[end]:A[mid : end] sorted => min不在A[mid+1 : end]中
搜索A[start : mid]
(2) A[mid] > A[end]:A[start : mid] sorted且又因为该情况下A[end]<A[start] => min不在A[start : mid]中
搜索A[mid+1 : end]
(3) base case:
a. start =  end,必然A[start]为min,为搜寻结束条件。
b. start + 1 = end,此时A[mid] =  A[start],而min = min(A[mid], A[end])。而这个条件可以合并到(1)和(2)中。

 

 

 

 

Suppose an array sorted in ascending order 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.

You may assume no duplicate exists in the array.

Example 1:

Input: [3,4,5,1,2] 
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

 

posted on 2018-07-18 08:17  猪猪&#128055;  阅读(90)  评论(0)    收藏  举报

导航