1.双指针求解
for(int i = 0 ,j = 0;i < n;i++){
while(j < i && check(i,j)) j++;
//题目实际逻辑
}
比如 "abc efg jkl mop" 要求输出每个单词。此时就可以使用双指针。
1.求数组中最大不重复子数组
int s[10]={0};
int a[5] = { 1,2,2,4,5 };
int res = 0;
int len = sizeof(a) / sizeof(a[0]);
for (int i = 0, j = 0; i < len; i++) {
s[a[i]]++;
while (s[a[i]] > 1) {
s[a[j]]--;
j++;
}
res = max(res, i - j + 1);
}
2.位运算
2.1 基本位运算
int n;
//左移输出第i位置
(n>>i)&1
//右移输入
(n<<i)|1;
(n<<i)|0;
2.2 数据二进制第K位
数据二进制中第K位是几?
int a = 10;
for (int i = 0; i < 8; i++) {
cout << (a >> i & 1)<<" ";
}
2.3 LowBit
X&(~X+1)=00...001000000 == X&-X |
统计数据中有几个1?
int a = 10;
int res = 0;//记录有几个1
while (a) {
a -= lowbit(a);
res++;
}
2.4.原码、反码、补码
计算机底层没办法进行减法计算,采用补码进行计算。
3.离散化
4.去重
5.区间合并
1.按照区间左端点排序;
2.分两种情况讨论合并问题
typedef pair<int,int>PII;
vector<PII>seg;
vector<PII>res;
sort(seg.begin(), seg.end());
int st = -2e9, ed = -2e9;
for (auto item: seg) {
if (st < item.first) {
if (st != -2e9) {
res.push_back({st,ed});
}
st = item.first;
ed = item.second;
}
else {
ed = max(ed, item.second);
}
}
if (st != -2e9) {
res.push_back({ st,ed });
}