- 跳出舒适区,刷自己不擅长的题型
- 追求最优解
- 分类总结,总结解题技巧
- 分析问题->建模->梳理业务流程->代码实现
- 逆向思维:如果正着推理很复杂,试试反着推理
- 连续子数组:—> 前缀和
进制与位运算:位运算、进制转换、进位计算等 基础数据结构:字符串(字典树等)、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()); 双指针,交换收尾两个滋镇
