数据结构的存储方式
数组 顺序存储
链表 链式存储
通过某一元素的前驱和后驱,删除元素或插入元素
不能随机访问
消耗更多的存储空间
基本操作 遍历+访问
种类
线性 for/while
非线性 递归
数组遍历
void traverse(int[] arr) {for (int i = 0; i < arr.length; i++) {// 迭代访问 arr[i]}}
链表遍历
/* 基本的单链表节点 */class ListNode {int val;ListNode next;}void traverse(ListNode head) {for (ListNode p = head; p != null; p = p.next) {// 迭代访问 p.val}}void traverse(ListNode head) {// 递归访问 head.valtraverse(head.next);}
二叉树遍历
/* 基本的二叉树节点 */class TreeNode {int val;TreeNode left, right;}void traverse(TreeNode root) {traverse(root.left);traverse(root.right);}
建议从树开始刷代码
动态规划解题框架
思维框架
明确base case —> 明确状态 —》 明确选择 —》定义dp数组
# 初始化 base casedp[0][0][...] = base# 进行状态转移for 状态1 in 状态1的所有取值:for 状态2 in 状态2的所有取值:for ...dp[状态1][状态2][...] = 求最值(选择1,选择2...)
