1. 分组循环
分组循环就是将整个数组分成多个片段,这些片段的处理逻辑是一样的。
模版
// 模板 l、r分别表示左右指针
int l=0,r=0;
while(r<n)
{
// 每一次求新区间则重新赋值l
l=r;
// r表示最长连续区间最后一个
while(r<n-1&&s[r]==s[r+1])
r++;
// 求完区间后收集结果
res=max(r-l+1,res);
// 并移动r到下一个
r++;
}
题单
题号 | 题目 |
---|---|
3105 | 最长的严格递增或递减子数组 |
1839 | 所有元音按顺序排布的最长子字符串 |
845 | 数组中的最长山脉 |
2110 | 股票平滑下跌阶段的数目 |
1759 | 统计同质子字符串的数目 |
1446 | 连续数组 |
1957 | 删除字符使字符串变好 |
1869 | 哪种连续子字符串更长 |
2. 枚举右,维护左
对于双变量问题,例如两数之和ai+aj=t,可以对右指针j来进行遍历,用一个哈希表来维护左区间。
模板
for(int i=0;i<a.length;i++){
Hash hash = new HashMap<>();
}
题单
题号 | 题目 |
---|---|
2815 | 数组中的最大数对和 |
2342 | 数位和相等数对的最大和 |
1679 | K和数对的最大数目 |
2260 | 必须拿起的最小连续卡牌数 |