题目链接:leetcode154
题面
题目大意
具体题意和 153 那道一样,只不过多了一个元素重复的条件。
解题思路
暴力
略
二分
做法和 153 一样,只不过对于 mid 和 右端点相等时,我们把区间 - 1 即可。
当然,在有大量重复元素的情况下,时间复杂度会退化到 O ( n ) O(n) O(n)。
注意:这两题的右边界 r 都被设为 n - 1 ,这是因为我们知道数组中一定有答案,则如果和正常的二分那样设置在 n 的未知,则最后结束循环的时候 l 可能越界到达 n 。此外,如果初始设置在 n 时,每次在算 mid 的值时,会使得左区间长度不小于右区间的长度。
代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size()-1, mid;
while (l < r) {
mid = l + (r - l >> 1);
if (nums[mid] < nums[r]) r = mid;
else if (nums[mid] > nums[r]) l = mid+1;
else r = r - 1;
}
return nums[l];
}
};