图片说明

  • 扫描一遍
    class Solution {
       public int findMin(int[] nums) {
          int n =nums[0] ; 
          for(int i = 1 ; i< nums.length;i++) {
              if(n>nums[i])
                  n = nums[i];
          }
          return n;
      }
    }
  • 扫描方法改进 找出通过旋转的条件可得 旋转点前是小一点数 旋转点后的数是大一点的数
    class Solution {
      public static int findMin(int[] nums) {
          int n = nums.length ; 
          int flag = nums[n-1];
          for(int i = 0 ; i < n ; i++){
              if(nums[i]<flag)
                  return nums[i];
          }
          return flag;
      }
    }
  • 二分 相比于前一道题 增加了多个相同的数
    class Solution {
      public static int findMin(int[] nums) {
          int l = 0;
          int r = nums.length-1 ; 
          while(l<r){
              int mid = (l+r)/2;
              if(nums[l]<nums[r])  
                  return nums[l];
              if(nums[mid]>nums[r])
                  l = mid+1;  //而且mid不是最小值   [3,1,3]  0.5变为0 无法使mid变化  导致一直储在原地
              else if(nums[mid]<nums[l])
                  r = mid;
              else r--;//避免了重复陷入死循环 而且最小值相对储在中间位置
          }
          return nums[l];
      }
    }
    //[3,1,3]
    //[1,1]
    //[1,3,5]
    //[2,2,2,0,1]
    //[2,0,0,0,1,2]