题目链接
英文链接:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
中文链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/
题目详述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
1 | 输入: [1,3,5] |
示例 2:
1 | 输入: [2,2,2,0,1] |
说明:
- 这道题是 寻找旋转排序数组中的最小值 的延伸题目。
- 允许重复会影响算法的时间复杂度吗?会如何影响,为什么?
题目详解
”数组 + 有序“可以联想到二分查找。本题是 LeetCode153-寻找旋转排序数组中的最小值 的加强版。因为数组中可能存在重复的元素,可能存在 [10,1,10,10,10] 这种极端情况。在这种情况下,算法必须退化到线性时间复杂度。
1 | public class LeetCode_00154 { |
另外,可以采用缩小存在区间的方法来得到最小值。
- 最小值下标的范围为 [0, nums.length - 1]。在二分查找过程中,不断缩小范围,直至只有一个区间元素,即为所求。
- 当 nums[mid] < nums[hi] 时,说明取值区间不可能在 [mid + 1, hi],令 hi = mid。
- 当 nums[mid] > nums[hi] 时,说明取值区间不可能在 [lo, mid],令 lo = mid + 1。
- 当 nums[mid] = nums[hi] 时,要么 nums[mid] 和 nums[hi] 均为最小值,要么 nums[mid] 和 nums[hi] 均不为最小值。可令 hi 自减,因为若 nums[mid] 和 nums[hi] 均为最小值,跳过 nums[hi] 这个最小值,还有 nums[mid] 这个最小值,对结果不会有影响;若 nums[mid] 和 nums[hi] 均不为最小值,显然可以跳过 nums[hi]。
1 | public class LeetCode_00154 { |
可以在 LeetCode153-寻找旋转排序数组中的最小值 的基础上,删掉数组末尾与开头相等的部分,使二分查找具备有界性。
1 | public class LeetCode_00154 { |