【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)

 题目链接:dd爱框框 (nowcoder.com)


一、分析题目

同向双指针(其实也就是滑动窗口)。

  • 进窗口(sum += arr[right])
  • 判断(sum >= x)
  • 更新结果(right-left+1 < retlen   retl = left   retr=right)
  • 出窗口(sum -= arr[left])

二、代码

1、自己 AC 的代码

//没看题解之前AC的代码
#include <iostream>
using namespace std;const int N=1e7+10, INF=1e9+7;
int a[N];int main()
{int n, x;cin >> n >> x;for(int i=1; i<=n; i++) cin >> a[i];int sum=0;int len=INF;int i=1;int l=1, r=1;for(int j=1; j<=n; j++){sum+=a[j];while(sum>=x){if(j-i+1<len){len=j-i+1;l=i, r=j;}sum-=a[i];i++;}}cout << l << ' ' << r << endl;return 0;
}//看了题解之后AC的代码
#include <iostream>
using namespace std;const int N=1e7+10;
int a[N];int main()
{int n, x;cin >> n >> x;for(int i=1; i<=n; i++) cin >> a[i];int sum=0;int len=N;int i=1, j=1;int left=1, right=1;while(j<=n){sum+=a[j];while(sum>=x){if(j-i+1<len){len=j-i+1;left=i, right=j;}sum-=a[i++];}j++;}cout << left << ' ' << right << endl;return 0;
}

2、值得学习的代码 

#include <iostream>
using namespace std;const int N = 1e7 + 10;
int arr[N];
int n, x;int main()
{cin >> n >> x;for(int i = 1; i <= n; i++) cin >> arr[i];int left = 0, right = 0, sum = 0;int retLen = N, retLeft = -1, retRight = -1;while(right <= n){sum += arr[right];while(sum >= x){if(right - left + 1 < retLen){retLeft = left;retRight = right;retLen = right - left + 1;}sum -= arr[left++];}right++;}cout << retLeft << " " << retRight << endl;return 0;
}

三、反思与改进

这道题一看完,我的第一反应是前缀和,因为题目给的公式和前缀和很像,于是就往前缀和方向去想了,最后只过了 20% 的样例,我认为是数据范围的关系(因为按照题目所给的数据范围,前缀和是会超时的)。总不可能用两层 for 循环嵌套暴力解法吧,肯定超时(果然,也是只过了 20% 的样例)。于是,大脑开始飞速运转,联想到前几天好像做到一题很类似的(刚刚去查了一下,发现考察内容基本一样:209. 长度最小的子数组 - 力扣(LeetCode),我晕),在写这道题目时,想到了思路,也知道可以减少比较次数的位置,但还是没能绕开两层 for 循环这个结构,其实滑动窗口就是在暴力解法上进行优化的。本质还是对滑动窗口掌握不熟练,还有就是总喜欢固定思维让 i 先遍历,然后 j 在 i 后面遍历,这道题目可以让 j 先遍历,然后 i 在 j 之前遍历,就可以起到 “剪枝” 的作用了。但这道题如果数组中有负数,就得采用前缀和了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day99:云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

目录 云原生-K8s安全-横向移动-污点Taint 云原生-K8s安全-Kubernetes实战场景 知识点&#xff1a; 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 云原生-K8s安全-横向移动-污点Taint 如何判断实战中能否利用污点Taint&#xff1f; 设置污点…

【御控物联】Java JSON结构转换(3):对象To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON对象 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

1 GBDT:梯度提升决策树

1 前言 前面简单梳理的基本的决策树算法&#xff0c;那么如何更好的使用这个基础算法模型去优化我们的结果是本节要探索的主要内容。 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff09;是一种集成学习方法&#xff0c;通常用于解决回归和分类问题。它通…

【Redis 神秘大陆】009 案例实践进阶

九、案例实践&进阶方案 9.1 本地缓存组件选型 使用缓存组件时需要重点关注集群方式、集群、缓存命中率。 需要关注集群组建方式、缓存统计&#xff1b;还需要考虑缓存开发语言对缓存的影响&#xff0c;如对于JAVA开发的缓存需要考虑GC的影响&#xff1b;最后还要特别关注…

05节-51单片机-模块化编程

1.两种编程方式的对比 传统方式编程&#xff1a; 所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路 模块化编程&#xff1a; 把各个模块的代码放在不同的…

无源光网络(PON)技术的革命:PON模块的全面解析

PON&#xff08;Passive Optical Network&#xff0c;无源光网络&#xff09;模块是一种高性能的光模块&#xff0c;用于PON系统中&#xff0c;符合ITU-T G.984.2标准和多源协议&#xff08;MSA&#xff09;。它通过不同的波长在OLT&#xff08;光线路终端&#xff09;和ONT&am…

超强开源项目!一款 5.6K star 的数据表格工具,灵活现代化【文末带源码】

今天给大家介绍一下 Grist 这个超级厉害的开源项目。 Grist 是一款现代化的数据表格工具&#xff0c;有着强大的功能和灵活的使用方式。 项目特色 这个项目把电子表格和数据库的优秀特点都结合起来&#xff0c;特色如下&#xff1a; 1. 可定制性&#xff1a; Grist 提供了非…

计算机网络 Cisco远程Telnet访问交换机和Console终端连接交换机

一、实验要求和内容 1、配置交换机进入特权模式密文密码为“abcd两位班内学号”&#xff0c;远程登陆密码为“123456” 2、验证PC0通过远程登陆到交换机上&#xff0c;看是否可以进去特权模式 二、实验步骤 1、将一台还没配置的新交换机&#xff0c;利用console线连接设备的…

SSL证书协议详解

SSL/TLS证书&#xff08;Secure Sockets Layer Certificate&#xff09;是一种由数字证书颁发机构&#xff08;CA&#xff09;签发的一种数字证书&#xff0c;用于确保网络通信的安全性和加密性。SSL证书用于验证服务器或网站的身份&#xff0c;并加密在客户端和服务器之间传输…

✌粤嵌—2024/3/29—赎金信✌

赎金信 代码实现&#xff1a; 哈希表 bool canConstruct(char *ransomNote, char *magazine) {int hash[26] {0};for (int i 0; i < strlen(ransomNote); i) {hash[ransomNote[i] - a];}for (int i 0; i < strlen(magazine); i) {if (hash[magazine[i] - a]) {hash[ma…

【网络设备巡检命令】--思科、华为、H3C、锐捷

【网络设备巡检命令】--思科、华为、H3C、锐捷 一、思科二、华为三、H3C四、锐捷 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、思科 1、查看系统信息&#xff1a; show version2、查看时间&#xff1a; show clock3、查看序列号&a…

在Vue项目使用kindEditor富文本编译器

第一步 npm install kindeditor第二步&#xff0c;建立kindeditor.vue组件 <template><div class"kindeditor"><textarea :id"id" name"content" v-model"outContent"></textarea></div> </templa…