必背算法

基础算法

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int binarySearch_leftopen_rightclose_duplicate_uper(vector<int> v, int x){
int n = v.size();
if (n < 2) {
return 0;
}
int lo = -1, hi = n - 1, mid = 0;
while (hi - lo > 1) {
mid = lo + (hi - lo)/2;
if (v[mid] <= x) {
lo = mid;
}
else
hi = mid;
}
return v[lo] == x ? lo : -1 ;
}

快排

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
int partition(vector<int> &v, int lo, int hi){
if(lo>=hi) return lo;
int pi = lo;
while (lo<hi) {
//hi先往lo方向走,双向走必到同一点
while (lo<hi && v[hi] >= v[pi]) {
hi--;
}
while (lo<hi && v[lo] <= v[pi]) {
lo++;
}
swap(v[lo], v[hi]);//交换过后仍循环符合条件
}
swap(v[pi], v[lo]);
return lo;
}
void qS(vector<int> &v, int lo, int hi){
if (lo>=hi) {
return;
}
int mid = partition(v, lo, hi);
qS(v, lo, mid - 1);
qS(v, mid + 1, hi);
return;
}
void qS2(vector<int> &v, int lo, int hi){
if (lo >= hi) {
return;
}

//partition
int i = lo, j = hi, randompi = lo + rand()%(hi -lo);
//1 pi一定还是最左,只是rand交换一下最左元素
swap(v[randompi], v[i]);

int pi = i;
//2 写入一个函数增加变量不然递归时lo和hi的值会变
while (i < j) {
//3 一定先从对立面
while (i < j && v[j] >= v[pi]) {
j--;
}
while (i < j && v[i] <= v[pi]) {
i++;
}
swap(v[i], v[j]);
}
swap(v[i], v[pi]);
//4 返回partition
int mid = i;

qS2(v, lo, mid - 1);
qS2(v, mid+1, hi);
return;
}

归并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void mergeV(vector<int> &v, int lo, int mid, int hi){
if (lo >= hi) {
return;
}
vector<int> tmp(v);
//xxxidx要相对从0
int cur1 = lo, cur2 = mid+1, idx = lo;
while (cur1 <= mid && cur2 <= hi) {
if (tmp[cur1] <= tmp[cur2]) {
v[idx++] = tmp[cur1++];
}
else
v[idx++] = tmp[cur2++];
}
while (cur1 <= mid) {
v[idx++] = tmp[cur1++];
}
while (cur2 <= hi) {
v[idx++] = tmp[cur2++];
}
return;
}

void mergeS(vector<int> &v, int lo, int hi){
if (lo >= hi) {
return;
}
//partition
int mid = lo + (hi - lo)/2;
//xxx和qS不同mid不是中立不传入mid-1
mergeS(v, lo, mid);
mergeS(v, mid + 1, hi);
mergeV(v, lo, mid, hi);

}

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void cdfs(vector<int> &cur, set<vector<int>> &res, vector<int> &visit, vector<int> &v, int dep, int len, int sum, int vdx){
if (dep == 4) {
if (sum == 0) {
res.insert(cur);
return;
}
return;
}
//扩展方式
for (; vdx < len; ++vdx) {
if (visit[vdx] == 0) {
visit[vdx] = 1;
cur.push_back(v[vdx]);
cdfs(cur, res, visit, v, dep + 1, len, sum + v[vdx], vdx + 1);
visit[vdx] = 0;
cur.pop_back();
}
}
return;

}

vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> res;
vector<int> cur;
set<vector<int>> tmp;
vector<int> visit(num.size(), 0);
if (num.size() < 1) {
return res;
}
sort(num.begin(), num.end());
cdfs(cur, tmp, visit, num, 1, num.size(), 0, 0);
for(auto i : tmp)
res.push_back(i);
return res;

}