项目空间

学习笔记N-033

单调性枚举(尺取法,双指针,滑动窗口)

更新
内容块
43
阅读
约 2 分钟
路径
学习笔记 / C++ / C++算法

index+1-1,+2-2很容易出错

解决问题:

  1. 1.区间和
  1. 2.判断在一个区间中是否满足条件(时间,数轴窗口)
  1. 3.包含关系(一个字符串中含有某些字母的最小连续子串)

数组中的数需要是正数

关键:

  1. 1.判断是否满足条件
  1. 2.r往后移动
  1. 3.l往后移动
  1. 4.更新答案

单调递增枚举,单调递减枚举

寻找二元组的和是指定值,因为二元数不分先后,所以不用i=0,j=0来判断,直接l=0,r=n-1;l<n来从两边向中间移动就行.

有些l和r的移动建立在原数组单调递增,递减上,要不还是先排个序吧

我们所维护的矩阵单调性,不是输入矩阵的每一行一定是从小到大的,而是在控制r和l时,根据判断条件的不同,r++和l++是否可以使判断条件单调变化,返回一个确定的,可预测的结果

单调性枚举 ≠ 输入数据本身有序。

单调性剪枝

从最大的范围开始,往一个一个方向去枚举(r--或l++),一旦这个方向中有一个值不符合给定值,那么就直接放弃这个方向(原地掉头)(一直去尝试移动一端的值,如果不能移动的话就换另一端的)

  1. 1.在二维数组中的应用:

lq2109

1.把二维数组化为一维数组来调用

2.窗口可以用[l, r)表示也可以用[l, r]表示,之后的维护不一样罢了(牵扯到数组越界)

[l,r]的窗口元素数是r-l+1

为什么C++所有的容器都是左闭右开,[l, r)而不是[l, r]?

排除长度为1的子数组的情况(ans 和l,r的关系也是有些难以理解)(lq2209)

有一个是不变的,满足题意得要求是刚好的,不满足题意的是要去掉新加上的这一位的。

循环:

  1. 1.for(int l = 0,r = n-1;l<r;)
  1. 2.for(int l = 0,r = 0;l < n;)
  1. 3.for(int i = 0;i<n;i++)

    for(int j = 0;j<m;j++)