用准确的语言,理清复杂的程序
维护、更新、修改、还原、保证、边界、偏移、贡献、单调、拓展、双射(记录、反馈)
第一组:维护—更新
一个值,需要常常更新它,来保证它的正确性,这就叫维护。
如求一个数组的最大值:
int a[5]={1,5,2,3,4},ma=a[0];
for(int i=0;i<5;i++){
if(ma<a[i]) ma=a[i];
}
这个题的思路就是,先把最大值的变量ma设为数组a第一个值a[0],然后遍历数组,如果a[i]比ma大,就更新ma为a[i].
结论:维护一个值,意味着要时时更新它。
第二组:修改—还原
一个值,在不同的环境下,会需要不同的值,这就需要我们在不同环境下切换,这就是:修改,还原
举例:给定一个日期,输出这个日期是该年的第几天。考虑闰年2月=29天,非闰年28天。
思路:当闰年是,把2月修改为29天,其他月份再还原成28天
//四年一润,百年不润,400年再润
if(y%4==0&&(y%100!=0 || y%400==0)){
mdays[2]=29;
}
else{
mdays[2]=28;
}
第三组:保证和边界
在一组数据的处理过程中,如递归时,要始终保证数据在有效的范围或者保证数据的有限性。
如求最大公约数,保证余数会退到0。KMP字符串查找中,保证回退到0就结束。
边界同样是各种算法要考虑的问题,保证数据有效的前提,就是让数据在边界之内。
偏移:定义:终点-起点=偏移。常用在位置关系的描述上,比如字符串中,’a’为起点,右偏移1得到’b’,偏移5得到’f’,偏移25得到’z’,同理:’z’左偏移1得到’y’,左偏移25得到’a’。还有,再区间[l,r]的整数数字的个数,r-l+1
一个好理解的解释为,从l到r偏移r-l
再加上起点l
自身得到r-l+1
。这些东西会在位置描述中大量的使用,必须熟练掌握。
单调:分单调递增,单调递减,见单调栈,以及单调队列
拓展:这个词常出现在树中,如拓展某节点,就是指执行该节点的子节点。在宽度优先搜索的模板:
队列 <--- 初始状态
while(队列不空){
t <--- 队头
拓展t
}
双射(记录、反馈):双射指一对互相映射的量。它们之间有记录和反馈的关系。通俗的讲:假设学校有一个全体学生记录表,记录所有人的学号和所在班级,有一名同学从1班转到3班,那么这名同学要反馈给记录表,否则记录表的信息就不准了。这就是记录和反馈。acwing839题模拟堆
对于区间里的个数,我一直是按照尾数减去首数 + 1来理解
到位