图片说明

  • 暴力

    class Solution {
      public int findMin(int[] nums) {
          int min = nums[0];
          for(int i = 1 ; i < nums.length;i++){
              if(min>nums[i])
                  min = nums[i];
          }
          return min;
      }
    }
  • 二分 三种情况

              //一开始是想看看通过断点的位置来发现规律 结果没有找到 分析过程 然后没分析出来 
              // if(nums[mid]>nums[l]&&nums[mid]<nums[r])
              //     r = mid;//该情况已经考虑
              // else if(nums[mid]>nums[r]&&nums[mid]<nums[l])
              //     l = mid;//该情况不存在
              // if(nums[mid]>nums[r]&&nums[mid]>nums[l])
              //     l = mid;
              // else if(nums[mid]<nums[r]&&nums[mid]<nums[l])
              //     r = mid;//没问题
    //深入分析
    class Solution {
      public int findMin(int[] nums) {
          //数组中不存在重复元素。
          int l = 0;
          int r = nums.length-1;
          while(l<r){
              if(nums[l]<nums[r])return nums[l];//二分后会落到某一段递增区间
              int mid = (l+r)/2;
              int temp = mid+1;
              if(nums[temp]>nums[mid]&&nums[mid]>nums[l]){ //二分条件
                  l = mid;
              }
              else if(nums[temp]>nums[mid]&&nums[mid]<nums[l]){//二分条件
                  r = mid;
              }
              else if(nums[temp]<nums[mid]){
                  return nums[temp];
              }
          }     
          return nums[l];
      }
    }