当前位置: 首页 > news >正文

[算法练习]Day 8: 变长滑动窗口

2904. 最短且字典序最小的美丽子字符串

        也是滑动窗口,要想好如何移动

class Solution {
public:string shortestBeautifulSubstring(string s, int k) {string ans;int left = 0;int cnt = 0;for(int right = 0;right < s.size();right++){cnt += (s[right] == '1');// 左指针移动while((cnt > k) || (s[left] == '0')){cnt -= (s[left] == '1');left++;}if(cnt == k){string temp(s.begin()+left,s.begin()+right+1);if(ans.size() == 0)ans = temp;else if(ans.size() == temp.size())ans = (ans > temp)?temp:ans;elseans = (ans.size() < temp.size())?ans:temp;}}return ans;}
};

2875. 无限数组的最短子数组

        我刚开始的思路就是对左右边界取模进行滑动窗口,但是数组不可能一直滑动去寻找解;这里如果nums的总和sum比target大,那么扩展2倍数组是一定能够得到答案的。但如果sum小于target,那么滑动窗口中就会额外出现完整个nums数组。因此我在这里设置了参数k来减少循环的次数。

class Solution {
public:int minSizeSubarray(vector<int>& nums, int target) {int ans = -1;int len = nums.size();long long s = 0;for(auto a:nums){s += a;}int k = ((target / s) + 1) * 2 ;int sum = 0;int left = 0;for(int right = 0; right < len * k ;right++){sum += nums[right % len];while(sum > target){sum -= nums[left % len];left++;}if(sum == target){if(ans == -1) ans = right-left+1;else ans = min(ans,right-left+1);}}return ans;}
};

        但还是不行,最后会有一个案例超时。看了灵神的解析才想到,既然sum都已经比target大了,那为什么不直接减去!!!这样就不需要白白循环了!真是学到了

class Solution {
public:int minSizeSubarray(vector<int>& nums, int target) {int ans = -1;int len = nums.size();long long s = 0;for(auto a:nums){s += a;}int k = target / s ;target -= k*s;int sum = 0;int left = 0;for(int right = 0; right < len * 2 ;right++){sum += nums[right % len];while(sum > target){sum -= nums[left % len];left++;}if(sum == target){if(ans == -1) ans = right-left+1+k*len;else ans = min(ans,right-left+1+k*len);}}return ans;}
};

713. 乘积小于 K 的子数组

对于每一个right来说,都有right-left+1个对应的解

class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int ans = 0;int muti = 1;int left = 0;for(int right = 0;right < nums.size();right++){muti *= nums[right];while(muti >= k && left <= right){muti = muti / nums[left];left++;}ans += right - left + 1;}return ans;}
};

3258. 统计满足 K 约束的子字符串数量 I

        相同的思路

class Solution {
public:int countKConstraintSubstrings(string s, int k) {int ans = 0;int cnt0 = 0;int cnt1 = 0;int left = 0;for(int right = 0;right < s.size();right++){if(s[right] == '1') cnt1++;else cnt0++;while(cnt1 > k && cnt0 > k){if(s[left] == '1') cnt1--;else cnt0--;left++;}ans += (right - left + 1);}return ans;}
};

1358. 包含所有三种字符的子字符串数目

        注意符合要求的区间

class Solution {
public:int numberOfSubstrings(string s) {int ans = 0;int left = 0;vector<int>cnt(3,0);for(int right = 0;right < s.size();right++){char c = s[right];if(c == 'a') cnt[0]++;else if(c == 'b') cnt[1]++;else cnt[2]++;while((cnt[0] > 0) && (cnt[1] > 0) && (cnt[2] > 0)){ans += s.size() - right; char c1 = s[left];if(c1 == 'a') cnt[0]--;else if(c1 == 'b') cnt[1]--;else cnt[2]--;left++;}}return ans;}
};

2962. 统计最大元素出现至少 K 次的子数组

        和上一个题的思路是一样的

class Solution {
public:long long countSubarrays(vector<int>& nums, int k) {int max = 0;for(auto i: nums){max = (i > max)?i:max;}long long ans = 0;int left = 0;int cnt = 0;for(int right = 0;right < nums.size();right++){cnt += (nums[right] == max);while(cnt >= k){ans += nums.size() - right;cnt -=(nums[left] == max);left++;}}return ans;}
};

http://www.dtcms.com/a/479234.html

相关文章:

  • 做网站联系wordpress怎么做背景图片
  • 道路建设网站专题上海网站seo设计
  • asp.net做网站系统wordpress 首页不显示
  • GESP2025年9月认证C++四级( 第三部分编程题(1)排兵布阵)
  • 论文解读 -- A FOUNDATION MODEL FOR MUSIC INFORMATICS
  • Redis-管道和发布订阅
  • 做网站最大可以做多少g代做网站多少钱
  • PostgreSQL 模式(Schema)详解
  • 网站网页制作及优化网站建设收费明细表
  • 网站建设的物流包装设计用什么软件
  • Java 大视界 -- Java 大数据流处理中的状态管理与故障恢复技术深度解析
  • 大型语言模型实战入门:从 API 到开源模型,掌握文本生成与对话核心技能
  • GEO优化公司
  • 做海报文案的参考网站wordpress压缩图片质量
  • HashMap的put方法的具体流程(高频)
  • 龙岩做网站开发多久时间wordpress onethink
  • 自己建网站做淘宝客网站建设的要点是什么
  • 服务器里面如何做网站中国的网站域名是什么意思
  • MQTT和WebSocket的差别
  • org的域名网站导航网源码
  • 网站开发合同封面学会网站建设三方协议
  • wordpress登陆背景seo免费网站建设
  • 烟台企业自助建站系统wordpress最多支持多少会员
  • 计算机毕业设计选题推荐:基于SpringBoot+Vue的前后端分离网吧管理系统(附源码+文档+调试+讲解)
  • 常平镇网站建设wordpress get_user_id
  • 【FFmpeg】销毁解码器时,必须清理剩余帧吗?
  • 烟台网站制作建设医生可以自己做网站吗
  • CV论文速递:覆盖视频生成与控制、图像视频修复、AIGC检测与隐私保护等方向!(10.06-10.10)
  • 牙周探诊出血点与炎症活动性关联性的临床再评估
  • 网站和软件建站37网游