当前位置:网站首页>leetcode刷题:栈与队列07(滑动窗口最大值)
leetcode刷题:栈与队列07(滑动窗口最大值)
2022-07-01 19:16:00 【涛涛英语学不进去】
239. 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?
提示:
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10^4
- 1 <= k <= nums.length
一路做完磕磕绊绊的。
本来拿到这题,好像不难啊,就这还困难???
咔咔几行写完代码
public int[] maxSlidingWindow(int[] nums, int k) {
/** * 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 * 输出:[3,3,5,5,6,7] * 共 8 个数,三个一组滑动,可组成 8-3+1 组,即 6 组 */
if (nums.length < 2) {
return nums;
}
int[] result = new int[nums.length - k + 1];
for (int i = 0; i < nums.length - k + 1; i++) {
int max = -10000;
for (int j = i; j < i + k; j++) {
if (nums[j] > max) {
max = nums[j];
}
}
result[i] = max;
}
return result;
}
对此我只能说:好长的测试用例啊。。。
然后改进思路,把暴力破解改成滑动。把一个窗口分成以下几个部分。
left 是当前过期的最大值
right 是新进来的值
mid 是上一个最大值,是那个旧区间的最大值,如图所示:当前mid=3
每次窗口后移,先看看之前的最大值还能用吧(最大值是否和 left 的值相同,相同则不能用了,就得重新遍历窗口找最大值);如果能用就继续用。
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length < 2) {
return nums;
}
int[] result = new int[nums.length - k + 1];
/** * 如果当前范围元素的最大值仍然是下一个范围的最大值,则继续用。 * 此处要判断当前位置是否过了 */
int maxValue = -10000;
for (int j = 0; j < k; j++) {
if (nums[j] > maxValue) {
maxValue = nums[j];
}
}
result[0] = maxValue;
//前k个已经比较过了
int resIndex = 1;
//抽象出来,左边界值,中间部分最大值,右边界值
for (int i = k; i < nums.length; i++) {
//刚过期的左边界
int left = nums[i - k];
int mid = maxValue;
int right = nums[i];
if (left>mid-1) {
//如果过期,就得重新再找最大值
maxValue = -10000;
for (int j = i - k + 1; j < i + 1; j++) {
if (nums[j] > maxValue) {
maxValue = nums[j];
}
}
}
//如果新元素比原来的大
if (right >= mid) {
maxValue = right;
}
result[resIndex] = maxValue;
resIndex++;
}
return result;
}
emmmm有长进,这次通过49个,只剩最后两个了。苦思冥想后,终于让我看到不一样的了。
这么多一样的。为了提高效率,除了要证明最大值是和 left 的值相同,更新证明这个最大值就是刚刚被淘汰的 left 的最大值。于是改了一行代码。通过了。
public static int[] maxSlidingWindow2(int[] nums, int k) {
/** * 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 * 输出:[3,3,5,5,6,7] * 共 8 个数,三个一组滑动,可组成 8-3+1 组,即 6 组 */
if (nums.length < 2) {
return nums;
}
int[] result = new int[nums.length - k + 1];
/** * 如果当前范围元素的最大值仍然是下一个范围的最大值,则继续用。 * 此处要判断当前位置是否过了 */
int maxValue = -10000;
for (int j = 0; j < k; j++) {
if (nums[j] > maxValue) {
maxValue = nums[j];
}
}
result[0] = maxValue;
//前k个已经比较过了
int resIndex = 1;
//抽象出来,左边界值,中间部分最大值,右边界值
for (int i = k; i < nums.length; i++) {
//刚过期的左边界
int left = nums[i - k];
int mid = maxValue;
int right = nums[i];
//部分优化,防止连续重复数字出现
//如果left就是那个最大值
if (left > mid - 1 && left != nums[i - k + 1]) {
//如果过期,就得重新再找最大值
maxValue = -10000;
for (int j = i - k + 1; j < i + 1; j++) {
if (nums[j] > maxValue) {
maxValue = nums[j];
}
}
}
//如果新元素比原来的大
if (right >= mid) {
maxValue = right;
}
result[resIndex] = maxValue;
resIndex++;
}
return result;
}
完美 AC !
边栏推荐
- 宅男壁纸大全微信小程序源码-带动态壁纸支持多种流量主
- On the usage of a magic function
- Oracle deadlock test
- 运动捕捉系统原理
- 强大的万年历微信小程序源码-支持多做流量主模式
- Develop those things: easycvr cluster device management page function display optimization
- Principle of motion capture system
- Écrire un document de blog
- Flask 常用组件
- [C language] explain the usage of memset() function in detail
猜你喜欢
Powerful, easy-to-use, professional editor / notebook software suitable for programmers / software developers, comprehensive evaluation and comprehensive recommendation
Myslq ten kinds of locks, an article will take you to fully analyze
Target detection - Yolo series
Optimization of the problem that the request flow fails to terminate during page switching of easycvr cluster video Plaza
Interesting! Database is also serverless!
What if the win11 shortcut key switching input method doesn't respond? Shortcut key switching input method does not respond
[mysql] install mysql5.7
How to create a pyramid with openmesh
朋友圈社区程序源码分享
2022熔化焊接与热切割上岗证题目模拟考试平台操作
随机推荐
Vulnerability recurrence - Net ueeditor upload
如何用OpenMesh创建一个四棱锥
What if win11 can't pause the update? Win11 pause update is gray. How to solve it?
docker ubuntu容器中安装mysql遇到的问题
Iframe 父子页面通信
Entering Ruxin Town, digital intelligence transformation connects "future community"
朋友圈社区程序源码分享
在技术升级中迎合消费者需求,安吉尔净水器“价值战”的竞争之道
EDA工具对芯片产业的重要性知识科普
深度学习 常见的损失函数
internship:复杂json格式数据编写接口
Richview trvdocparameters page parameter settings
【蓝桥杯Web】2022年第十三届蓝桥杯Web大学组国赛真题解析
收藏:存储知识全面总结
Powerful, easy-to-use, professional editor / notebook software suitable for programmers / software developers, comprehensive evaluation and comprehensive recommendation
Big factories are wolves, small factories are dogs?
如果浏览器被意外关闭,react怎么缓存用户填写的表单?
math_利用微分算近似值
极客DIY开源方案分享——数字幅频均衡功率放大器设计(实用的嵌入式电子设计作品软硬件综合实践)
Stack overflow 2022 developer survey: where is the industry going?