新征程1.17 基础算法 上
前言:
今天的学习内容是位运算和双指针,当然还有离散化和区间合并,这两个下次再讲。先讲双指针和位运算;
想必大家在初学oi时,一定遇到过这种问题,自己精心打造的代码好不容易过了样例,以为自己可以切掉这个题,当提交后却发现超时了;这是因为大家还没掌握可以缩短代码运行时间的技巧。这里双指针就派上了用场
思想
先来说双指针的核心思想:双指针是指在遍历对象时,使用两个或多个指针进行遍历及相应的操作。大多用于数组操作,这利用了数组连序性的特点。双指针常用来降低算法的时间复杂度,因为使用两个指针可以避免多层循环。就像就像之前学的归并排序和快速排序一样,其中也用到了双指针;
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
}
常见问题分类:
(1) 对于一个序列,用两个指针维护一段区间
(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
然后就是位运算,这个是用来算二进制数的;
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
其他知识点:
二进制中1的个数
求n的第k位数字: n >> k & 1
返回n的最后一位1:lowbit(n) = n & -n
本文参考文献
双指针详解
本文来自博客园,作者:deviancez,转载请注明原文链接:https://www.cnblogs.com/deviance/articles/18112917

浙公网安备 33010602011771号