双指针算法
提高效率,例如:快速排序,归并排序,KMP算法
将朴素算法优化到O(n)
for(int i = 0,j = 0; i < n ; i++)
{
while(j < i && check(i,j)) j++;
// 每到题目的具体逻辑
}
原码 反码 补码
求n的二进制标识中第k位是几
先把第k位移到最后一位。
再看个位是几 x&1
n>>k&1
#include <iostream>
using namespace std;
int main()
{
int n = 10;
for(int k = 3 ; k >= 0 ; k --) cout << n>>k&1;
return 0;
}
lowbit操作:返回x的最后一位1(树状数组的操作)
例如:x = 1010 则lowbit(x) = 10
x = 101000 则lowbit(x) = 1000。
lowbit(x)= x&-x。
x&-x = x&(~x+1)
离散化
数的范围很大:如2^9,数的个数很小:如2^5
a[] : 1 3 100 20000 500000 (有序)
映射:0 1 2 3 4
1.a[]中可能重复元素— 去重
alls.erase(unique(alls.begin(),alls.end(),alls.end());
2.如何算出a[i]离散化后的值是多少?二分
int find(int x)
{
}