路径搜索
发表于
更新于
本文字数:
1.1k
阅读时长 ≈
4 分钟
辅助代码(全局变量)
1 | typedef pair<int, int> node; |
DFS
- DFS是无法找到最优路径的(理论上可以,但是复杂度巨高,如果是四个方向搜索的话,那么就是四叉树,高度是图中结点数,也就是说如果是10x10的图,那就是大约4^100复杂度)
- 下面代码只表示找到任意一条路后直接返回
1 | vector<vector<bool>> visited(row, vector<bool>(col, false)); |
字符串匹配
发表于
更新于
本文字数:
777
阅读时长 ≈
3 分钟
BF(Brute Force)算法
- BF是最符合人类直觉的字符串匹配算法,但是主串的下标
i经常要往回走,无法利用已匹配信息,效率不够好
1 | int bruteForce(const string& t, const string& p) { |
KMP算法
- 思想:“利用已部分匹配的信息,保持
i指针不回溯,通过修改j指针,让模式串尽量移动到有效的位置” - 定义
next数组:next[j] = d表示当t[i] != p[j]时,j下一次匹配的位置。注意到,下标从0开始,d值实际上是下标j前的最长前后缀子串的长度 - 求取
next的过程本身就是p串与自己匹配的过程- 当
p[i]==p[j],则p[++i] = ++j - 当
p[i]!=p[j],则利用前面已求得的next数组,j=next[j];直到无法找到,此时j=-1,自动进入第一个if语句,此时i往后走一步,妙
- 当
计算器
发表于
更新于
本文字数:
316
阅读时长 ≈
1 分钟
功能说明
- 实现+、-、*、/、括号的整数运算
- 实现处理多余空格
实现1(更高效)
- 用引用
l指针的方式逐步处理
1 | int core(string& s, int& l) { |
链表排序
发表于
更新于
本文字数:
1k
阅读时长 ≈
4 分钟
1. 插入排序
- 只要注意每次判断比前面的大那就不需要回头
- 否则需要从头找合适的位置
1 | ListNode* insertSort(ListNode* head) { |
2. 归并排序
- 不论是主递归还是merge都要求两个链表以nullptr结尾
- 也就是在合适的地方断开
十大排序总结
发表于
更新于
本文字数:
5.9k
阅读时长 ≈
21 分钟
一、简单排序
- 定义:对于下标$i<j$,如果$A[i]>A[j]$,则称$(i,j)$是一对逆序对(inversion)
- 定理:任意$N$个不同元素组成的序列平均具有$N(N-1)/4$个逆序对。
- 定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为$Ω(N^2)$
1. 冒泡排序
- 时间复杂度:$O(N^2)$
- 最好情况下的时间复杂度,有序$O(N)$
- 空间复杂度:$O(1)$
- 稳定(比较相等时,是不做交换的)
- end标记可以提前结束
- 链表也可用
- 每次交换都会消除一对逆序对
- 如果$I$是逆序对的个数,时间复杂度是$O(N+I)$
1 | void bubbleSort(vector<int>& arr) { |
Set、Map、Unordered
发表于
更新于
本文字数:
758
阅读时长 ≈
3 分钟
设计模式-单例模式
发表于
更新于
本文字数:
743
阅读时长 ≈
3 分钟
单例模式
0、静态函数变量版本
利用C++特性
1 | template <class T> |
1、普通版本(高并发效率不足)(安全)
线程安全智能指针
发表于
更新于
本文字数:
235
阅读时长 ≈
1 分钟
线程安全的share指针
1. 代码部分
1 | #include <iostream> |
2. 参考资料
二分变种
发表于
更新于
本文字数:
547
阅读时长 ≈
2 分钟
540 有序数组中的单一元素
我的二分
- 与右侧配对失败:
- 右侧是奇数:
l = m + 1 - 右侧是偶数:
r = m
- 右侧是奇数:
- 与右侧配对成功:
- 右侧是奇数:
l = m + 2 - 右侧是偶数:
r = m - 1
- 右侧是奇数:
1 | class Solution { |