真正写对「二分查找」,从来不在于我们把区间写成了「左闭右开」还是「左闭右闭」,而是 在于我们能够根据题意:得到某种单调性,和可以逐步缩小搜索规模的条件,进而准确地设计可以使得搜索区间缩小的条件。
500提交纪念
剑指 Offer II 041. 滑动窗口的平均值
代码实现(首刷自解)
class MovingAverage {
public:
/** Initialize your data structure here. */
queue<int> q;
int size;
double sum = 0;
MovingAverage(int size) {
this->size = size;
}
double next(int val) {
if (q.size() == size) {
sum += val - q.front();
q.push(val), q.pop();
}
else {
sum += val;
q.push(val);
}
return sum / q.size();
}
};
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage* obj = new MovingAverage(size);
* double param_1 = obj->next(val);
*/
1838. 最高频元素的频数
代码实现(首刷自解)
class Solution {
public:
int maxFrequency(vector<int>& nums, int k) {
int n = nums.size();
int l = 1, r = n;
sort(nums.begin(), nums.end());
while (l < r) {
int m = (l + r + 1) >> 1;
long long minNum = 0;
long long num = 0;
for (int i = 0; i < m - 1; i++)
num += nums[m - 1] - nums[i];
minNum = num;
for (int k = m; k < n; k++) {
num += - (nums[k - 1] - nums[k - m]) +
(long long) (m - 1) * (nums[k] - nums[k - 1]);
minNum = min(minNum, num);
}
if (minNum <= k) l = m;
else r = m - 1;
}
return l;
}
};
540. 有序数组中的单一元素
代码实现(首刷自解)
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int ans = 0;
for (auto num : nums) ans ^= num;
return ans;
}
};