前言
算法和算法题的任务目标,主要可分为:“增 删 改 查” 这四种。
数据结构则包括:数组,字符串,堆,栈,队列,链表,树,集合等等。
所以在数组,字符串,堆,栈,队列,链表,树,集合等等这些不同的数据结构上,执行 “增 删 改 查”这任意一种(或以上)任务,它们之间只需排列组合一番,就形成了现在数量繁多的算法题目(剑指offer,LeetCode)。前人在解决这些问题时,也逐渐总结形成了针对不同数据结构,执行不同任务时候的一些方法(如:快慢针——链表/查找,二分查找——数组/查找,十排序——数组/修改)。
因此解决剑指offer和LeetCode的题目时,往往是考验我们对其中的算法和数据结构的理解。甚至在特定数据结构中进行的 “增 删 改 查” 操作,所能使用的算法,应该是比较固定的。比如,在有序数组中执行查找任务,我们马上就要想到二分查找。这些经验虽然不一定是百试百灵,但是还是非常实用的。
题目索引
剑指offer虽然牛客和力扣上的题目不太一样,但是建议是两边都要刷。
我的索引结构是:
数据结构1: |____ 任务目标 - 题目1 |____ 任务目标 - 题目2 |____ ...... |____ 特殊算法: |____ |____ 任务目标 - 题目n |____ |____ 任务目标 - 题目n+1 |____ |____ ...... 数据结构2: |____ 任务目标 - 题目1 |____ 任务目标 - 题目2 |____ ...... |____ 特殊算法: |____ |____ 任务目标 - 题目n |____ |____ 任务目标 - 题目n+1 |____ |____ ...... ......
============ 数 ============
查 - 【剑指offer】43. 1~n 整数中 1 出现的次数
查 - 【剑指offer】49. 丑数
分治法 :
位运算 :
贪心算法 :
动态规划 :
============ 数组 ============
查 - 【剑指offer】39. 数组中出现次数超过一半的数字
动态规划 :
二分法 :
查 - 【剑指offer】53. 数字在排序数组中出现的次数
回溯搜索/DFS/BFS:
排序:
改 - 【剑指offer】21. 调整数组顺序使奇数位于偶数前面
位运算 :
双指针:
贪心算法 :
============ 字符串 ============
动态规划 :
回溯搜索 :
双指针:
查 - 【剑指offer】48. 最长不含重复字符的子字符串
============ 链表 ============
双指针法:
============ 树 ============
查 - 【剑指offer】32.3 从上到下打印二叉树3 / 按之字形顺序打印二叉树