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

[算法练习]Day 5:定长滑动窗口+变长滑动窗口

3694. 删除子字符串后不同的终点

        这个做了好久,思路是会的但是对c++的stl还是不是特别熟练。列举一下通过这个题学到的内容:

  1. 对于set容器,其模板参数只能有一个类型,不能set<int,int>s;
  2. 有的容器支持pair类型的哈希处理有些不支持,一般来说unordered的容器是不支持的
class Solution {
public:int distinctPoints(string s, int k) {int ans = 0;int x = 0;int y = 0;for(char c: s){switch(c){case 'U': y++;break;case 'D': y--;break;case 'L': x--;break;case 'R': x++;break;}}int len = s.size();// 只需要计数就好了呀!!笨死了我// 用set不就好了// 但是set的模板只能使用一个类型,真没招了// 可以用两个int进行拼接为longlong类型set<pair<int,int>>st;for(int right = 0;right < len;right++){switch(s[right]){case 'U': y--;break;case 'D': y++;break;case 'L': x++;break;case 'R': x--;break;}int left = right - k + 1;if(left < 0) continue;st.insert({x,y});switch(s[left]){case 'U': y++;break;case 'D': y--;break;case 'L': x--;break;case 'R': x++;break;}}ans = st.size();return ans;}
};

3. 无重复字符的最长子串

注意双指针的思想,主要就是要找准移动指针的时机。我写的代码有点冗余

class Solution {
public:int lengthOfLongestSubstring(string s) {int ans = 0;unordered_set<char>st;for(int r = 0,l = 0;r < s.size();r++){int temp = st.size();st.insert(s[r]);if(st.size() == temp){while(l <= r){if(s[l] == s[r]){l++;break;}else{st.erase(s[l]);l++;}}}else{ans = max((int)st.size(),ans);}}return ans;}
};

3090. 每个字符最多出现两次的最长子字符串

        这么写更为简洁,直接移动左指针并根据最多出现的字符为依据进行判断。

class Solution {
public:int maximumLengthSubstring(string s) {int ans = 0;unordered_map<char,int>umap;for(int l = 0,r = 0;r < s.size();r++){char c = s[r];umap[c]++;while(umap[c] > 2){umap[s[l]]--;l++;}ans = max(ans,r-l+1);}return ans;}
};

1493. 删掉一个元素以后全为 1 的最长子数组

        这个题我的思路就是:首先一定要保证区间的一致性,要么半开半闭要么全闭区间,我这里选择的全闭区间,即区间中只能有一个0!其次使用zero保存0是否存在,感觉写的不是特别简洁。

class Solution {
public:int longestSubarray(vector<int>& nums) {int ans = 0;int zero = 1;int temp = 0;for(int left = 0,right = 0;right < nums.size();right++){if(nums[right] == 1){temp++;ans = max(ans,temp-zero);continue;}if(nums[right] == 0){if(zero == 1){zero--;ans = max(ans,temp-zero);continue;}else{while(nums[left] != 0){left++;temp--;}left++;}}}return ans;}
};

但是灵神的思路是使用变量来维护区间中0的个数,确实更加的简洁,学习一下

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

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

相关文章:

  • 华为OD机试C卷 - 完美走位 - 滑动窗口 - (Java C++ JavaScript Python)
  • 【JEECG】 子改主#表单值改变事件
  • wordpress密码hellogoogle搜索优化方法
  • 网站建设分析报告网站如何快速备案
  • 2019 做网站wordpress联系表单发生错误
  • 苏州网站建设系统电话白嫖二级域名
  • Kanass入门到实战(12) - 实现需求、任务、用例、缺陷与文档的全流程管理
  • idea使用联网缓存的pom进行离线开发
  • ASP Application:深度解析与应用实践
  • 广州白云区做网站网站推广预期达到的目标
  • 建筑网站do浙江省龙泉市建设局网站
  • 【笔记】偏摩尔量
  • 速成网站 改版 影响wordpress目录
  • 【深入理解计算机网路07】详解局域网:以太网、VLAN与无线局域网
  • 网站谷歌地图提交江西省赣州市天气预报15天
  • 数据库架构演进:从读写分离到大数据解析
  • 多字节串口收发IP设计(三)串口发送模块设计及仿真(含源码)
  • 损失函数(深度学习)
  • Python 包管理革命:传统 pip 与极速 uv 的深度解析
  • 工装设计网站案例wordpress不花钱
  • 骰子魔法:三骰和频统计的C++巧妙解法(洛谷P2911)
  • 免费营销型网站网站建设文化服务公司
  • CSS 中 transation 主要作用是什么
  • 网站推广模式提高网站订单转化率
  • gdp-peda :No module named ‘six.moves‘
  • python做网站后台大连开发区网站设计公司
  • MySQL MHA(Master High Availability)高可用方案详解
  • 杭州商城网站制作淄博网站排名优化
  • Spring 前后端通信加密解密
  • 手机网站建设多少钱做教师知识网站有哪些