学习笔记N-033
单调性枚举(尺取法,双指针,滑动窗口)
- 更新
- 内容块
- 43
- 阅读
- 约 2 分钟
- 路径
- 学习笔记 / C++ / C++算法
index+1-1,+2-2很容易出错
解决问题:
- 1.区间和
- 2.判断在一个区间中是否满足条件(时间,数轴窗口)
- 3.包含关系(一个字符串中含有某些字母的最小连续子串)
数组中的数需要是正数
关键:
- 1.判断是否满足条件
- 2.r往后移动
- 3.l往后移动
- 4.更新答案
单调递增枚举,单调递减枚举
寻找二元组的和是指定值,因为二元数不分先后,所以不用i=0,j=0来判断,直接l=0,r=n-1;l<n来从两边向中间移动就行.
有些l和r的移动建立在原数组单调递增,递减上,要不还是先排个序吧
我们所维护的矩阵单调性,不是输入矩阵的每一行一定是从小到大的,而是在控制r和l时,根据判断条件的不同,r++和l++是否可以使判断条件单调变化,返回一个确定的,可预测的结果
单调性枚举 ≠ 输入数据本身有序。
单调性剪枝
从最大的范围开始,往一个一个方向去枚举(r--或l++),一旦这个方向中有一个值不符合给定值,那么就直接放弃这个方向(原地掉头)(一直去尝试移动一端的值,如果不能移动的话就换另一端的)
- 1.在二维数组中的应用:
lq2109
1.把二维数组化为一维数组来调用
2.窗口可以用[l, r)表示也可以用[l, r]表示,之后的维护不一样罢了(牵扯到数组越界)
[l,r]的窗口元素数是r-l+1
为什么C++所有的容器都是左闭右开,[l, r)而不是[l, r]?
排除长度为1的子数组的情况(ans 和l,r的关系也是有些难以理解)(lq2209)
有一个是不变的,满足题意得要求是刚好的,不满足题意的是要去掉新加上的这一位的。
循环:
- 1.for(int l = 0,r = n-1;l<r;)
- 2.for(int l = 0,r = 0;l < n;)
- 3.for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)