- 跳出舒适区,刷自己不擅长的题型
- 追求最优解
- 分类总结,总结解题技巧
- 分析问题->建模->梳理业务流程->代码实现
- 逆向思维:如果正着推理很复杂,试试反着推理
- 连续子数组:—> 前缀和
进制与位运算:位运算、进制转换、进位计算等 基础数据结构:字符串(字典树等)、vector/queue/stack/list/map/set 高级数据结构:树(二叉树、二叉查找树) 堆(二叉堆、优先队列) 图(bfs、dfs、拓扑排序、二分图) 常用算法应用:排序和查找 枚举(遍历、排序、组合)、模拟、滑动窗口、双指针、前缀和、差分数组等 迭代、递归、回溯、分治(归并、二分)、搜索(bfs\dfs)、贪心 动态规划
1、 链表
// 单链表
struct ListNode {
int val;
ListNode* next;
ListNode(int v) : val(v), next(nullptr) {}
};
// 删除特定节点
ListNode* removeListNode(ListNode* head, int val) {
ListNode* p = new ListNode(-1);
p->next = head;
ListNode* cur = p;
while (cur->next) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur = cur->next->next;
delete tmp;
continue;
}
cur = cur->next;
}
head = p->next;
delete p;
return head;
}
// 翻转链表
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* pre = nullptr;
ListNode* tmp = nullptr;
while (cur) {
tmp = cur->next; // 临时变量
cur->next = pre; // 翻转操作
pre = cur;
cur = tmp;
}
return pre;
}
// 双链表
struct DoubleList {
int val;
DoubleList* pre;
DoubleList* next;
DoubleList(int x) : val(x), pre(nullptr), next(nullptr) {}
};
1.1 练习
- 翻转链表 - 双指针
- 两两交换链表中的
2、哈希表
2.1 练习
3、双指针
3.1 练习
- 三数之和 — 注意去重:判断条件
(i > 0 && num[i] == num[i - 1])
- 四数之和 — 方法与三数之和一致,在三数之和基础上再套一层for循环
- 反转字符串 — reverse(s.begin(), s.end()); 双指针,交换收尾两个滋镇