154. 寻找旋转排序数组中的最小值 II

转跳点:--\(˙<>˙)/--

原本打算大年三十十一起写完的,结果这篇拖到了年初一……

这道题比刚刚那道,麻烦一点,因为有重复,所以我们需要考虑重复的情况,就是刚刚的两种情况变成了三种:

  • mid < right:left = mid+1
  • mid > right:right = left;
  • mid = right:left++;

为什么是++?题目说了升序,如果相等那么说明只有两种可能

  1. 整个数组都是一个数
  2. 旋转点极有可能就是这个数(貌似和解题无关)

所以无论如何那种情况,题设想要的最小值一定得往后判断,全数组一样也得往后,因为输入的代码需要通用性。如果非要 -- 也可以,不过得从right--,并且left = mid。

代码如下:

int findMin(int* nums, int numsSize){
    int low = 0, high = numsSize-1;
    while (low < high)
    {
        if (nums[low] < nums[high])
        {
            return nums[low];
        }
        int mid = low + (high - low) / 2;
        if (nums[mid] > nums[high])
        {
            low = mid + 1;
        }
        else if (nums[mid] < nums[high])
        {
            high = mid;
        }
        else
        {
            low++;
        }
    }
    return nums[low];
}

算法不易,诸君共勉!

相关推荐