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

同向双指针合集(力扣)

283. 移动零

代码

class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size();int l = 0, r = 0;while(r < n){if(nums[r]){swap(nums[l],nums[r]);l++;}r++;}}
};

209. 长度最小的子数组

代码

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {   int n = nums.size();int ans = n + 1;int sum = 0;int left = 0, right = 0;for(right = 0; right < n; right++){sum += nums[right];while(sum - nums[left] >= target){sum -= nums[left];left++;}if(sum >= target) ans = min(ans, right - left + 1);}if(ans == n + 1) return 0;return ans;}
};

乘积小于 K 的子数组

代码

class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int n = nums.size();if(k <= 1) return 0;//严格小于1的只有0和负整数,不成立int ans = 0, sum = 1, left = 0, right = 0;for(right = 0; right < n; right++){sum *= nums[right];while(sum >= k){sum /= nums[left];left++;}ans += right - left + 1;}return ans;}
};

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

代码

class Solution {
public:
//空格 常见字符最小的ascii码int cnt[330];int lengthOfLongestSubstring(string s) {int maxnum = 0, l = 0;for(int r = 0; r < s.size(); r++){if(cnt[s[r] - ' '] > 0){while(cnt[s[r] - ' '] > 0){cnt[s[l] - ' ']--;l++;}}maxnum = max(maxnum, r - l + 1);cnt[s[r] - ' ']++;}return maxnum;}
};

438. 找到字符串中所有字母异位词

代码

class Solution {
public:vector<int> findAnagrams(string s, string p) {int n = p.size();map<char,int>mp;for(auto i : p)mp[i]++;int left = 0;vector<int>ans;n = s.size();for(int right = 0 ; right < n; right++){mp[s[right]]--;while(mp[s[right]] < 0){mp[s[left]]++;left++;}if(right - left + 1 == p.size())ans.push_back(left);//因为子串是连续的,且上面处理了非子串的字符必定无法包含进去}return ans;}
};

76. 最小覆盖子串

代码

class Solution {
public:string minWindow(string s, string t) {map<char,int>cnt;int num = 0;for(auto i : t){if(!cnt[i]) num++;//记录字符串里不同字符的种类数cnt[i]++;}int count = 0, l = 0;string tp ="";int minnum = 100010;for(int r = 0; r < s.size();r++){cnt[s[r]]--;if(cnt[s[r]] == 0) count++;//记录已匹配的字符数if(count == num){while(cnt[s[l]] < 0){cnt[s[l]]++;l++;}if(r - l + 1 < minnum){minnum = r - l + 1;tp = s.substr(l,minnum);}cnt[s[l]]++;count--;l++;}}return tp;}
};

同向双指针,除了因题目而进行的一些条件的特判外,往往是

  1. l r 从起点出发,移动右指针r
  2. 移动的过程中根据题目条件对左指针进行移动,从而使得特殊情况也满足条件
  3. 根据题目要求的结果,对需要输出的最大长度/子串/起始点进行判断,因为特殊情况也提前被我们处理为了满足条件的情况,所以往往单独放在for循环体的最后进行统计即可。
http://www.lryc.cn/news/322607.html

相关文章:

  • G - Find a way
  • AJAX 02 案例、Bootstrap框架
  • SinoDB客户端工具dbaccess
  • postman学习
  • 【Linux】初识进程
  • 有关Theano和PyTensor库
  • 用 Open-Sora 高效创作视频,让创意触手可及
  • Git版本管理工具
  • 微信小程序选择器picker的使用(省市区)
  • std::shared_ptr与std::make_unique在类函数中的使用
  • flutter 局部view更新,dialog更新进度,dialog更新
  • Lombok:@Delegate优化代码利器
  • 【C语言】对称密码——栅栏的加密和解密
  • 一、rv1126开发之视频输入和视频编码
  • 4.1 用源文件写汇编代码
  • Linux TCP参数——tcp_abort_on_overflow
  • jupyter notebook设置代码提示方法
  • Linux 一点查询资料
  • 如何快速搭建一个完整的vue2+element-ui的项目-二
  • 多语言LLM的状态:超越英语
  • kafka什么情况下会认为发送失败进而去重试
  • 不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette
  • C# 设置AutoScroll为true没效果的原因分析和解决办法
  • <Senior High School Math>: inequality question
  • 详解Python中Pytest和Unittest的区别
  • 零基础入门多媒体音频(1)-音频基础
  • 40 道高频 C++ 面试、笔试题及答案
  • 【07】进阶html5
  • Linux|centos7|postgresql数据库|yum和编译方式安装总结(全系版本)
  • C++提高笔记(五)---STL容器(set/multiset、map/multimap)