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

青羊区电商型网站建设设计网络营销专业大学排名

青羊区电商型网站建设设计,网络营销专业大学排名,网站运营现状,新乡网站建设设计双指针法(尺取法) 双指针法,又名 尺取法(Sliding Window/Two Pointers) ,能够解决区间问题;例如,找出和不小于 k 的最小连续区间。 双指针的运作方式,类似用尺蠖虫一曲一…

双指针法(尺取法)

双指针法,又名 尺取法(Sliding Window/Two Pointers) ,能够解决区间问题;例如,找出和不小于 k 的最小连续区间。
双指针的运作方式,类似用尺蠖虫一曲一伸的爬行方式。尺蠖虫在日文中写作尺取虫,尺取法可能源自于此。
在这里插入图片描述
尺取法是一种高效的区间处理技巧,常用于解决连续子区间/子数组/子字符串问题。其核心是通过两个指针(左、右边界)动态调整窗口范围,结合条件判断快速找到满足要求的区间,时间复杂度通常为 O(n)


核心原理

  1. 窗口定义:用 leftright 指针表示窗口的左右边界。
  2. 窗口扩展right 指针向右移动,尝试扩大窗口,直到满足条件。
  3. 窗口收缩:一旦窗口满足条件,left 指针向右移动,尝试缩小窗口,寻找更优解或统计结果。
  4. 终止条件right 指针遍历完整个数组/字符串。

应用场景

  • 最小覆盖子串
  • 最长无重复子串
  • 和为特定值的连续子数组
  • 固定长度的子数组最大值
  • 统计满足条件的区间数量

通用模板代码

void slidingWindow(string s, string t) {unordered_map<char, int> need, window; // 统计字符需求及当前窗口for (char c : t) need[c]++; // 初始化需求int left = 0, right = 0; // 窗口边界int valid = 0; // 记录窗口中满足需求的字符数量while (right < s.size()) {// 1. 扩大窗口:移动 right 指针char c = s[right++];if (need.count(c)) { // 如果当前字符是目标字符window[c]++;if (window[c] == need[c]) valid++; // 满足需求时更新 valid}// 2. 收缩窗口:移动 left 指针(根据条件判断)while (valid == need.size()) { // 当前窗口满足所有需求// 在这里处理结果(如记录最小长度)// 缩小窗口char d = s[left++];if (need.count(d)) {if (window[d] == need[d]) valid--; // 窗口不再满足需求时更新window[d]--;}}}// 返回最终结果
}

典型问题解析

1. 最长无重复字符子串
int lengthOfLongestSubstring(string s) {unordered_map<char, int> window;int left = 0, right = 0;int max_len = 0;while (right < s.size()) {char c = s[right++];window[c]++;// 收缩窗口:直到重复字符消失while (window[c] > 1) {char d = s[left++];window[d]--;}max_len = max(max_len, right - left);}return max_len;
}
2. 找到所有字母异位词(固定窗口)
vector<int> findAnagrams(string s, string p) {unordered_map<char, int> need, window;for (char c : p) need[c]++;vector<int> res;int left = 0, right = 0, valid = 0;while (right < s.size()) {char c = s[right++];if (need.count(c)) {window[c]++;if (window[c] == need[c]) valid++;}// 固定窗口大小:当窗口长度等于 p 的长度时收缩while (right - left >= p.size()) {if (valid == need.size()) res.push_back(left);char d = s[left++];if (need.count(d)) {if (window[d] == need[d]) valid--;window[d]--;}}}return res;
}
3.连续的正整数段,使得段中所有数之和为 N
  for (int l = 1, r = 2, sum = 3; l <= n/2;) {if (sum == n) {cout << l << ' ' << r << endl;sum -= l, l++;} else if (sum < n) {r++, sum += r;} else { // sum > nsum -= l, l++;}}

关键技巧

  1. 数据结构:使用哈希表(如 unordered_map)快速统计字符频率。
  2. 移动条件
    • 扩展窗口:当窗口不满足条件时,移动 right
    • 收缩窗口:当窗口满足条件时,移动 left 寻找最优解。
  3. 边界处理:注意指针移动时对哈希表的更新顺序(如先检查再增减)。
  4. 复杂度:由于每个元素最多被 leftright 各访问一次,时间复杂度为 O(n)

例题:

题目描述

给定一个正整数 N,请你求出所有的连续的正整数段,使得段中所有数之和为 N, 每段至少有两个数字。

例如:1998+1999+2000+2001+2002=10000,所以从 1998 到 2002 的一个自然数段为 N=10000 的一个解。

用 l 和 r 代表区间的左右端点,sum 记录区间数字和;
当 sum 小于目标值 N 时,将右端点右移,sum会变大;
当 sum 大于目标值 N 时,将左端点右移,sum会变小 ;
如果 sum==N,意味着找到答案,则输出;
因为,双指针都是单调向右移动,也只扫一遍,所以时间复杂度为O(n) ;
左端点大于N/2时即可停止,因为区间长度至少为2,区间和再不会小于 N 了。

http://www.dtcms.com/wzjs/14730.html

相关文章:

  • nat123做视频网站百度广告业务
  • wordpress阅读数修改关键词优化报价怎么样
  • wordpress社区程序黄石seo诊断
  • 南宁网站seo推广软件赚钱的app
  • 阿里巴巴网站怎样做的漂亮深圳做网站的
  • 可以做样机图的网站短视频营销成功案例
  • 企业网站设计一般多少钱企业网站推广的一般策略
  • 现在有哪些网站是做批发的网络营销的方式有十种
  • 网络运营需要什么学历惠州关键词排名优化
  • wordpress 无法加载css深圳seo优化排名优化
  • 附近室内设计培训学校南京seo招聘
  • WordPress改造成mipseo标题优化关键词
  • 门户网站制作平台江苏网站建站系统哪家好
  • 哪家网站建设服务好新闻内容摘抄
  • 买了个网站后怎么做的nba季后赛最新排名
  • 寺庙招人做网站维护吗公众号推广引流
  • 优良的定制网站建设武汉网站seo
  • 西安网站制作工作室seo优化的主要任务包括
  • 东莞网页制作招聘信息百度seo简爱
  • 最新网站建设方案最有效的广告宣传方式
  • 网站的外部链接怎么做品牌策划方案模板
  • 横峰网站建设汕头seo网站建设
  • 帝国做网站互联网
  • wordpress ip_hash失效常用的seo查询工具
  • 鹏达建设集团有限公司网站360seo关键词优化
  • 专业的河南网站建设怎么优化网站关键词的方法
  • 网站的建设分析关键词排名查询工具
  • 网站静态和动态区别是什么代写平台
  • 甘肃省5g网站建设中标单位网络推广员要怎么做
  • 政务公开与网站建设网站优化系统