dfs
dfs 代码 12345678910111213141516171819202122int n;int path[N];bool st[N];void dfs(int u){ if(u==n){ for(int i=0;++i) printf("%d ", path[i]); return; } for(int i=1;i<=n;++i){ if(!st[i]){ path[u] = i; st[i]=true; dfs(u+1); st[i]=false; } }}
栈
栈 12345678910111213141516int stk[N], tt; // 栈顶下标// 插入stk[++tt]=x;//弹出tt--;// 判断栈是否为空if(tt>0) not empty;else empty;// 栈顶stk[tt]; 中缀表达式 表达式树的中序遍历 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#include <iostream>#include <stack>#include <string>#include <unordered_map>using namespace std;stack<int> num;stack<char> op;//优先级表unordered_map<char, int> h{...
链表
链表 单链表 邻接表:存储图、树 head $\rightarrow \empty$ node: val, next 值数组: e[N] (val数组) 指针数组: ne[N] (next 数组) e和ne用下标关联起来 代码 1234567891011121314151617181920212223242526272829const int N = 100010;// idx 存储当前已经用到哪个点int head, e[N], ne[N], idx;void init(){ head = -1; idx = 0;}//将x插到头节点void add_to_head(int x){ e[idx] = x; ne[idx] = head; head = idx; ++idx;}// 将x插到下标是k的结点后面void add(int x, int k){ e[idx] = x; ne[idx] = ne[k]; ne[k] = idx; idx++;}/...
队列
队列 123456789101112131415// 队尾插入元素,队头弹出元素int q[N], hh=0, tt=-1; // 队头head, 队尾tail// 插入q[++tt] = x;//弹出hh++;// 判断是否为空if(hh<=tt) not empty;else empty;// 取出队头元素q[hh]
二分
二分 思路 左边边界点 mid=(l+r+1)/2, check左边性质,check(mid)为true, 答案在[mid,r] , l=mid 为false, 答案在[l, mid-1], r= mid-1 右边边界点 mid=(l+r)/2 check右边性质, true, 答案在[l,mid], r=mid false, 答案在[mid+1, r],l=mid+1 l=mid要加1,r=mid不用 代码 1234567891011121314151617181920212223242526272829303132333435363738bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r...
归并
归并排序 思想: 分治 确定分界点mid=(l+r)/2 递归排序left,right 归并–合二为一 编程: 对两个有序序列合并到第三个数组res里,双指针分别指向两个有序序列min1,min2,比较较小者插入到res数组里 123456789101112131415161718void merge_sort(int q[], int l, int r){ if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; else tmp[k ++ ] = q[j ++ ]; while (i <= mid) tmp[k +...
快排
快速排序 思想:分治 确定分界点q[l], q[(l+r)/2],q[r] 调整区间 ≤ x, ≥ x 递归处理左右两段 编程: 两个指针i,j,i指针从左开始,j指针从右边开始,i左边的数都是小于等于x的,j右边的数都是大于等于x的 每次i遇到不小于x的停下来,j遇到不大于x的停下来,交换 直到i和j相遇 12345678910111213void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q...
curl使用注意事项
用curl时需要对中文参数进行 URL 编码
switch语句使用注意事项
switch语句往往有多个case, 这时候要注意每个case结束后及时break,否则case逻辑穿透出错
C/C++ 指针使用前必须做的事
指针使用前必须分配内存空间啊!
