题目

image.png
image.png

题解

这道题相对于力扣81题,难上啦许多,需要考虑多种情况。毕竟这道题你是不知道经历多少次旋转的,而且还是找最小值,
这时候就需要考虑
L与R的关系,要通过L与R的关系判断出数组大致旋转情况
L与R的关系中 加入中间值,这三个值成何种情况同样有对应什么关系。
L与R 会有三种情况

  • L == R
  • L > R
    • 加入中间值 会对应处两种情况
  • L < R

    • 加入中间值,同样对应两种情况

      代码

      1. /**
      2. * @param {number[]} nums
      3. * @return {number}
      4. */
      5. var findMin = function(nums) {
      6. let l = 0;
      7. let r = nums.length - 1;
      8. while(l <= r) {
      9. const mid = (l + r) >> 1;
      10. const curValue = nums[mid];
      11. const lValue = nums[l];
      12. const rValue = nums[r];
      13. if(lValue == rValue) l++;
      14. else if (lValue < rValue) {
      15. if(curValue > lValue && curValue > rValue) r = mid - 1;
      16. else r = mid;
      17. } else {
      18. if(lValue <= curValue && curValue > rValue) l = mid + 1;
      19. else r = mid;
      20. }
      21. }
      22. return nums[r]
      23. };

      优化后

      1. /**
      2. * @param {number[]} nums
      3. * @return {number}
      4. */
      5. var findMin = function(nums) {
      6. let l = 0;
      7. let r = nums.length - 1;
      8. while(l <= r) {
      9. const mid = (l + r) >> 1;
      10. const curValue = nums[mid];
      11. const lValue = nums[l];
      12. const rValue = nums[r];
      13. if(lValue == rValue) l++;
      14. else if (lValue < rValue && curValue > lValue) r = mid - 1;
      15. else if(lValue > rValue && lValue <= curValue) l = mid + 1;
      16. else r = mid;
      17. }
      18. return nums[r]
      19. };

      再次优化

      1. /**
      2. * @param {number[]} nums
      3. * @return {number}
      4. */
      5. var findMin = function(nums) {
      6. let l = 0;
      7. let r = nums.length - 1;
      8. if(nums[l] < nums[r]) return nums[l];
      9. while(l <= r) {
      10. const mid = (l + r) >> 1;
      11. const curValue = nums[mid];
      12. const lValue = nums[l];
      13. const rValue = nums[r];
      14. if(lValue == rValue) l++;
      15. else if (lValue < rValue && curValue > lValue) r = mid - 1;
      16. else if(lValue > rValue && lValue <= curValue) l = mid + 1;
      17. else r = mid;
      18. }
      19. return nums[r]
      20. };

      图解

      l == r

      判断不出数组的情况, 让左指针向右移动一位
      image.png

      l > r

      image.png
      l < mid < r 这种情况就很容易划分出小数区域,很明显小数区域在 mid 到 r 之间 可以将左指针移动到mid+1
      image.png
      这种情况下就很难通过mid来划分出小数区域与大数区域,那我们就可以将右指针移动到mid的位置,看左指针与mid的中间值

      l < r

      image.png
      这种情况下是不是很容易划分出小数区域,和大数区域
      但是如果这种情况在数组中间出现呢
      image.png