【宫水三叶】排序 + 滑动窗口运用题
排序 + 滑动窗口
从 $n$ 个元素里找 $k$ 个,使得 $k$ 个元素最大差值最小。
最大值最小化问题容易想到「二分」,利用答案本身具有「二段性」,来将原本的求解问题转化为判断定问题。
回到本题,容易证明,这 $k$ 个元素必然是有序数组中(排序后)的连续段。反证法,若最佳 $k$ 个选择不是连续段,能够调整为连续段,结果不会变差。
因此我们可以先对 $nums$ 进行排序,然后扫描所有大小为 $k$ 的窗口,直接找到答案,而无须使用「二分」。
代码(二分答案代码见 $P2$):
###Java
class Solution {
public int minimumDifference(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length, ans = nums[k - 1] - nums[0];
for (int i = k; i < n; i++) {
ans = Math.min(ans, nums[i] - nums[i - k + 1]);
}
return ans;
}
}
###Java
class Solution {
int[] nums; int k;
public int minimumDifference(int[] _nums, int _k) {
nums = _nums; k = _k;
Arrays.sort(nums);
int l = 0, r = 100010;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return r;
}
boolean check(int x) {
int n = nums.length, ans = nums[k - 1] - nums[0];
for (int i = k; i < n && ans > x; i++) {
ans = Math.min(ans, nums[i] - nums[i - k + 1]);
}
return ans <= x;
}
}
- 时间复杂度:排序复杂度为 $O(n\log{n})$;遍历得到答案复杂度为 $O(n)$。整体复杂度为 $O(n\log{n})$
- 空间复杂度:$O(\log{n})$
其他「滑动窗口」内容
题太简单?来看一道 更贴合笔试/面试的滑动窗口综合题 🎉 🎉
或是加练其他「滑动窗口」内容 🍭🍭🍭
| 题目 | 题解 | 难度 | 推荐指数 |
|---|---|---|---|
| 3. 无重复字符的最长子串 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩🤩 |
| 30. 串联所有单词的子串 | LeetCode 题解链接 | 困难 | 🤩🤩 |
| 187. 重复的DNA序列 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩 |
| 219. 存在重复元素 II | LeetCode 题解链接 | 简单 | 🤩🤩🤩🤩 |
| 424. 替换后的最长重复字符 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩 |
| 438. 找到字符串中所有字母异位词 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩 |
| 480. 滑动窗口中位数 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩 |
| 567. 字符串的排列 | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 594. 最长和谐子序列 | LeetCode 题解链接 | 简单 | 🤩🤩🤩🤩 |
| 643. 子数组最大平均数 I | LeetCode 题解链接 | 简单 | 🤩🤩🤩🤩🤩 |
| 992. K 个不同整数的子数组 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩 |
| 1004. 最大连续1的个数 III | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 1052. 爱生气的书店老板 | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 1208. 尽可能使字符串相等 | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 1423. 可获得的最大点数 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩 |
| 1438. 绝对差不超过限制的最长连续子数组 | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 1610. 可见点的最大数目 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩 |
| 1838. 最高频元素的频数 | LeetCode 题解链接 | 中等 | 🤩🤩🤩 |
| 注:以上目录整理来自 wiki,任何形式的转载引用请保留出处。 |
最后
如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/
也欢迎你 关注我 和 加入我们的「组队打卡」小群 ,提供写「证明」&「思路」的高质量题解。
所有题解已经加入 刷题指南,欢迎 star 哦 ~
