双指针:
核心思想:优化
暴力:(时间复杂度O(n^2)
for(int i = 0; i < n; i ++)
for(int j = 0; j < i; j ++)
if(check(i, j))
双指针:(时间复杂度接近O(n))
for(int i = 0, j = 0; i < n; i ++){
while(j < i && check(i, j))
一般写双指针之前都可以向写一下暴力。
位运算:
位运算对我来说只能见到一点学习一点,感觉这个的内容太大了,现在我只会一点简单的位运算(我之前写过一次关于位运算)。
lowbit(int a) 返回的最有的1的位置 例如 33(二进制为100100) lowbit(33) = 4(二进制为100)
int lowbit(int a){
return a & -a;
}
-a为a的补码(-a = ~a + 1)
库函数
unique(a.begin(), a.end()),对a去重并返回其去重后的迭代器(这里说的不是很明白)
举个例子: a[] = { 1, 1, 2, 3, 4, 4, 4, 5, 5, 6}
unique(a.begin(), a.end()) 后 a[] = {1, 2, 3, 4, 5, 6, ... }返回6后面的迭代器。
一般与erase一起用(纯属个人感觉)(用于vector容器中)
vector<int> a; a[] = { 1, 1, 1, 1, 1, 2, 3, 4, 4, 6, 6, 7, 9}
a.erase(unique(a.begin(), a.end()), a.end()); 后 a[] = { 1, 2, 3, 4, 6, 7, 9}
unique函数的实现
vector<int>::iterator unique(vector<int>& a){
int j = 0;
for(int i = 0; i < a.size(); i ++)
if(!i || a[i] != a[i - 1]
a[j ++] = a[i];
总结:
现在总算把基础算法看完了(排序,高精度,前缀和(结合在哈希表中了)这些前面都发过了),
有些位置对我来说还是有点难理解的,哎,后面要学习数据结构了,难度也越来越大了,只能慢慢来了。