20210409 LeetCode 每日一题(寻找旋转排序数组中的最小值 II)

395 阅读1分钟

题目描述

原题链接:寻找旋转排序数组中的最小值 II

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]

  • 若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]

    注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

示例

输入:nums = [1,3,5]
输出:1

解答

这题是寻找旋转排序数组中的最小值的延伸题,思路基本和上一篇题解差不多,但由于可能存在重复的元素时需要作特殊判断,还是将每个中点的数与末尾的数作比较,特别的是当中点数与末尾数相同时将末尾坐标缩减即可:

/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function (nums) {
  let start = 0,
    end = nums.length - 1,
    mid
  while (start <= end) {
    mid = start + ~~((end - start) / 2)
    if (nums[mid] < nums[end]) {
      end = mid
    } else if (nums[mid] > nums[end]) {
      start = mid + 1
    } else {
      //  两数比较,相等时的特殊处理
      end = end - 1
    }
  }
  return nums[mid]
}

复杂度分析:

  • 时间复杂度:平均时间复杂度 O(logN),最坏情况下(所有数都为同一个数时)复杂度是 O(N)。
  • 空间复杂度:O(1)