• 跳出舒适区,刷自己不擅长的题型
  • 追求最优解
  • 分类总结,总结解题技巧
  • 分析问题->建模->梳理业务流程->代码实现
  • 逆向思维:如果正着推理很复杂,试试反着推理
  • 连续子数组:—> 前缀和

进制与位运算:位运算、进制转换、进位计算等 基础数据结构:字符串(字典树等)、vector/queue/stack/list/map/set 高级数据结构:树(二叉树、二叉查找树) 堆(二叉堆、优先队列) 图(bfs、dfs、拓扑排序、二分图) 常用算法应用:排序和查找 枚举(遍历、排序、组合)、模拟、滑动窗口、双指针、前缀和、差分数组等 迭代、递归、回溯、分治(归并、二分)、搜索(bfs\dfs)、贪心 动态规划

专题零:刷题分类总结 - 图1

1、 链表

  1. // 单链表
  2. struct ListNode {
  3. int val;
  4. ListNode* next;
  5. ListNode(int v) : val(v), next(nullptr) {}
  6. };
  7. // 删除特定节点
  8. ListNode* removeListNode(ListNode* head, int val) {
  9. ListNode* p = new ListNode(-1);
  10. p->next = head;
  11. ListNode* cur = p;
  12. while (cur->next) {
  13. if (cur->next->val == val) {
  14. ListNode* tmp = cur->next;
  15. cur = cur->next->next;
  16. delete tmp;
  17. continue;
  18. }
  19. cur = cur->next;
  20. }
  21. head = p->next;
  22. delete p;
  23. return head;
  24. }
  25. // 翻转链表
  26. ListNode* reverseList(ListNode* head) {
  27. ListNode* cur = head;
  28. ListNode* pre = nullptr;
  29. ListNode* tmp = nullptr;
  30. while (cur) {
  31. tmp = cur->next; // 临时变量
  32. cur->next = pre; // 翻转操作
  33. pre = cur;
  34. cur = tmp;
  35. }
  36. return pre;
  37. }
  1. // 双链表
  2. struct DoubleList {
  3. int val;
  4. DoubleList* pre;
  5. DoubleList* next;
  6. DoubleList(int x) : val(x), pre(nullptr), next(nullptr) {}
  7. };

1.1 练习

  1. 翻转链表 - 双指针
  2. 两两交换链表中的

2、哈希表

2.1 练习

3、双指针

3.1 练习

  • 三数之和 — 注意去重:判断条件(i > 0 && num[i] == num[i - 1])
  • 四数之和 — 方法与三数之和一致,在三数之和基础上再套一层for循环
  • 反转字符串 — reverse(s.begin(), s.end()); 双指针,交换收尾两个滋镇