剑指offer-笔记

搜索与回溯 树

第 6 天
搜索与回溯算法(简单)
剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
广度优先搜索 二叉树
广度优先遍历 队列实现 用数组存结果

第 7 天
搜索与回溯算法(简单)
剑指 Offer 26. 树的子结构
深度优先搜索
深度遍历树的每一个节点
再用一个递归函数比较当前节点以root的子树和子结构是否一致
比较子结构的递归函数
当递归到子结构的树为null时返回true
否则比较当前两个树的根值 继续递归比较

剑指 Offer 27. 二叉树的镜像
递归 先交换左右节点值 再递归左右子树 返回root

剑指 Offer 28. 对称的二叉树
递归 在第二个函数递归比较根节点的左右子树

第 14 天
搜索与回溯算法(中等)
剑指 Offer 12. 矩阵中的路径
数组 回溯 矩阵
剑指 Offer 13. 机器人的运动范围
深度优先搜索&广度优先搜索

第 15 天
搜索与回溯算法(中等)
剑指 Offer 34. 二叉树中和为某一值的路径
深度优先搜索 回溯
深度优先遍历 若当前节点为叶节点且targetSum等于当前节点 记录当前路径
在递归中先将节点值加入路径 然后递归左右子树 再移出当前节点值

剑指 Offer 36. 二叉搜索树与双向链表
栈 树 深度优先搜索
//中序遍历依次递增 存头节点 当前节点 最后处理首尾节点指向即可

剑指 Offer 54. 二叉搜索树的第k大节点
深度优先搜索 二叉搜索树

第 18 天
搜索与回溯算法(中等)
剑指 Offer 55 - I. 二叉树的深度
递归实现
剑指 Offer 55 - II. 平衡二叉树
深度优先搜索
//递归实现 遍历每一个节点 比较左右子树的高度差

111 二叉树的最小深度 最小深度注意判断当左右节点有一个为null时 递归返回另一个边的深度+1
104 二叉树的最大深度 正常返回左右子树的最大深度 +1

第 19 天
搜索与回溯算法(中等)
剑指 Offer 64. 求1+2+…+n
位运算
递归
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
深度优先搜索
二叉搜索树
//和二叉树的最近公共祖先差不多
递归实现
利用二叉搜索树的性质判断最近公共祖先在左右子树的哪一边 继续递归相应边的子树 最后返回当前节点
剑指 Offer 68 - II. 二叉树的最近公共祖先
深度优先搜索
//递归实现
递归终止条件 当前root为空或等于p或q
判断以root为根的左右子树是否包含 p q
根据情况返回 若左右子树都包含 则当前root为最近公共祖先 否则返回不为空的一边(有可能都为空)

第 28 天
搜索与回溯算法(困难)
剑指 Offer 37. 序列化二叉树
// 深度优先遍历
序列化用前序遍历处理 返回前序遍历的字符串
反序列化 将字符串转化为字符队列 然后dfs处理
在dfs函数中 取出一个字符 若为null返回null 然后创建字符值的节点 左右子树分别dfs剩下的字符队列

剑指 Offer 38. 字符串的排列
字符串 回溯
// 回溯算法 dfs(index, arr);
选择列表和路径都是数组本身 固定第index位及之前的 然后遍历交换第index位和剩下的index + 1 … n位
若剩下的index + 1 … n位有重复的 不交换(这里在选择路径循环定义一个集合判断)
遍历交换完 继续递归回溯 固定第index+1位 然后交换回来 撤销交换

解答思路用来解决leetcode 全排列2(有重复数字的) 全排列1(就是一个回溯全排列)

动态规划

第 8 天
动态规划(简单)
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 63. 股票的最大利润
定义dp[i] 为前i天买出的最大利润 维护一个最小值即可
也可定义dp[i]为第i天买出的最大利润 也要维护一个最小值

**第 9 天 **
动态规划(中等)简单的!!
剑指 Offer 42. 连续子数组的最大和
//定义dp[i]为子数组…nums[i]连续子数组的最大和 以num[i]结尾

剑指 Offer 47. 礼物的最大价值
//定义dp[i][j]为到达grid[i][j]最多拿到的礼物价值

**第 10 天 **
动态规划(中等)
剑指 Offer 46. 把数字翻译成字符串
//定义dp[i]为字符串"num"中子串0-i的翻译种数
//dp[i] = dp[i-1] + dp[i-2] if 两个数字subtring(i-1,i+1) <=25

剑指 Offer 48. 最长不含重复字符的子字符串
//定义dp[i]是以子串…s[i]结尾的最大无重复字符串

第 29 天
动态规划(困难)
剑指 Offer 19. 正则表达式匹配

剑指 Offer 49. 丑数
313 超级丑数
(这类题用最小堆来做 简单 PriorityQueue 定义一个最小堆 每次取一个最小值乘于质因子 若不重复则加入最小堆里 第n个取出的就是答案 )

剑指 Offer 60. n个骰子的点数 (着重看!!)
// 动态规划
定义dp[n]为n个骰子的概率分布
已知dp[n-1]的概率分布 根据f(n,x)的概率是 f(n-1,x-1)… f(n-1,x-6)的和除于6
正向遍历 防止f(n-1,x-6)越界 就是计算f(n-1,x)的每一项对 f(n,x + k)的贡献度 k < 6

第 24 天
剑指 Offer 14- I. 剪绳子
// 动态规划
// dp[i]数组表示长度为n的绳子 剪后的最大乘积
// 剪绳子是将大段的绳子剪成小段,然后再在每小段上继续剪)
dp[i] = Math.max(dp[i],dp[j] * dp[i-j]);

第 31 天
剑指 Offer 43. 1~n 整数中 1 出现的次数
递归 数学 不是动态规划做的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值