网站搭建联系方式简述如何对网站进行推广
1. 题目描述
元素可重复的旋转数组的最小值
2. 思路
ref
对二分的奇怪知识增加了!
需要注意的一点是,由于我们在二分过程中改变了 r r r 的位置,因此不能一直使用预先存放的 n u m s [ r ] nums[r] nums[r]!
3. 代码
/*本题与 153 题的区别在于,有重复元素如果有重复元素,我们就无法确定左右区间也就无法二分了 😭但是事实真的是这样吗?事实上,如果我们遇到了边界情况,即:nums[mid] == last(nums[n-1])我们可以直接“删掉末尾元素”,这不会对答案求解有影响,因为此时有两种情况1. last是最小值,那么 nums[mid] 也是最小值,删去也无妨2. last不是最小值,此时删去当然无影响如果last是最小值,那么 nums[mid] 也是最小值
*/
class Solution {
public:int minArray(vector<int>& nums) {int l = 0, r = nums.size() - 1;// int last = nums[r]; // 错误!!!!我们的last是动态变化的while(l < r) {int mid = l + r >> 1;if(nums[mid] == nums[r]) r -- ; // 删掉,神来一笔!else if(nums[mid] > nums[r]) l = mid + 1; // leftelse r = mid; // right}return nums[l];}
};