随笔分类 -  算法与题解

1 2 3 4 5 ··· 7 下一页
摘要:题目 剑指 Offer 62. 圆圈中最后剩下的数字 思路1(模拟) 使用链表模拟删除节点 代码 class Solution { public int lastRemaining(int n, int m) { int index = 0; // 初始化链表 List<Integer> list 阅读全文
posted @ 2022-01-11 23:52 linzeliang 阅读(27) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2、3、5 这三个质因子的数字,同时 1 也是丑数。要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2、3、5,选取出最小的那个数 但是如果每计算一个丑数都要将之前重新遍历一遍,时间复杂度较高 因此我们使用动态规划,创建一 阅读全文
posted @ 2022-01-11 22:13 linzeliang 阅读(45) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 47. 礼物的最大价值 思路1 因为是要求最大价值,而且只能移动下方或者右方,因此,每个位置的最大值就是本身的值加上上边 / 左边 中的最大值,然后每次遍历都可以复用上一次的值。因此我们可以得到状态转移方程: \(dp[i][j]=\begin{matrix} max(dp[ 阅读全文
posted @ 2021-12-03 02:32 linzeliang 阅读(89) 评论(0) 推荐(1) 编辑
摘要:题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字符串,每次可以翻译一个或者两个,但是翻译两个的时候还要判断是否为有效的,像 01、02 这种的数字就 阅读全文
posted @ 2021-12-02 20:16 linzeliang 阅读(94) 评论(0) 推荐(1) 编辑
摘要:题目 剑指 Offer 42. 连续子数组的最大和 思路1(分析数组的规律) 我们可以从头到尾逐个累加,若之前的累加和小于0,那就从丢弃之前的累加,从当前开始重新累加,同时在遍历过程中比较记录下最大值 curSum记为当前最大值,为 0,以 [-2,1,-3,4,-1,2,1,-5,4] 为例: 首 阅读全文
posted @ 2021-11-27 18:20 linzeliang 阅读(78) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 10- II. 青蛙跳台阶问题 思路1(递归 / 自顶向下) 这题就是和上一题剑指 Offer 10- I. 斐波那契数列基本一模一样,都是 fib(n) = fib(n-1) + fib(n-2) 这个递推公式,只是初始条件不一样啦:上一题是 0、1、1、2...,而本题是 阅读全文
posted @ 2021-11-27 13:28 linzeliang 阅读(28) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 10- I. 斐波那契数列 思路1(递归 / 自顶向下) 这题是很常见的一道入门递归题,可以采用自顶向下的递归方法,比如我们要求第n个位置的值,根据斐波那契数列的定义fib(n) = fib(n-1) + fib(n-2),即等于前一个和前前一个两个的值之和 但是如果直接递归 阅读全文
posted @ 2021-11-27 12:13 linzeliang 阅读(48) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 32 - III. 从上到下打印二叉树 III 思路1 这题又是上一题剑指 Offer 32 - II. 从上到下打印二叉树 II的升级版,要求我们每层的遍历:一层是从左往右,另一层从右往左,因此可以使用一个布尔值flag来记录每次的状态(每次遍历结束后将flag取反),如果 阅读全文
posted @ 2021-11-25 23:46 linzeliang 阅读(21) 评论(0) 推荐(1) 编辑
摘要:题目 剑指 Offer 32 - II. 从上到下打印二叉树 II 思路1 和剑指 Offer 32 - I. 从上到下打印二叉树很类似,不过这一题多加了一个条件,就是是要按层来存储节点的 在每次循环的时候要先获取队列中存在多少个元素size,这代表当前层有多少个节点,然后我们再用一个内循环将这些节 阅读全文
posted @ 2021-11-25 23:22 linzeliang 阅读(18) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 32 - I. 从上到下打印二叉树 思路1 BFS广度优先搜索遍历二叉树,使用队列存储节点 算法执行流程如下: 如果root,不为空,先加入队列,否则直接结束(因为一个元素都没有了嘛) 从队列queue中取出队头元素,存入列表res中,然后如果他的左节 / 右节点点不为空,就 阅读全文
posted @ 2021-11-25 23:09 linzeliang 阅读(19) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的那个深度再加上当前一层返回给父节点,是自底向上的 也为要求是否为平很二叉树,要保证他的左子树和右子树 阅读全文
posted @ 2021-11-24 22:51 linzeliang 阅读(54) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其中一个节点左子树为空,右子树有一个叶子节点,那么 0 > 1 ,肯定选 1 ,再加上当前一层 1 , 阅读全文
posted @ 2021-11-24 20:12 linzeliang 阅读(31) 评论(0) 推荐(1) 编辑
摘要:题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树、输出节点、遍历右子树得到的是升序结果,要得到降序,需要按照先遍历右子树、输出节点、再遍历左子树即可 什么时候结束 阅读全文
posted @ 2021-11-24 19:04 linzeliang 阅读(42) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 28. 对称的二叉树 思路1 看到这题首先想到可以将二叉树复制一份镜像的,然后进行后续遍历比较两棵树的每一个节点是否相等,但是这样未免太复杂了,因此我们可以用更好的方法来解决 一般来说,二叉树的后续遍历是从左子树开始的,但是我们也可以调换一下位置,从右子树开始递归,这样子和左 阅读全文
posted @ 2021-11-24 12:33 linzeliang 阅读(21) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 27. 二叉树的镜像 思路1(递归) 我们可以使用深度优先搜索,先递归到链表的末尾,然后从末尾开始两两交换。就相当于后续遍历而已 记得要先保存下来node.right节点,因为我们在递归完左边才递归右边,而递归完左边的时候,直接把node.right的指向修改了,如果事先不保 阅读全文
posted @ 2021-11-24 01:16 linzeliang 阅读(686) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 13. 机器人的运动范围 思路1(DFS) 通过DFS递归,先往一个方向递归到最深地方,然后回溯,直到吧所有的条件都访问一遍 我们使用visited数组记录在访问过程中被访问的位置(因为每个位置最多只能访问一次) 然后每次递归都要判断是否满足如下条件: 不超边界,始终坐标位置 阅读全文
posted @ 2021-11-21 21:10 linzeliang 阅读(43) 评论(0) 推荐(0) 编辑
摘要:二分法模版及细节 —— 转载自博客园 二分查找算法细节详解 我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏个等号,要么少加个 1。 不要气馁,因为二分查找其实并不简单。思路很简单,细节是魔鬼。 本文以问答的形式,探究几个最常用的二分查找场景:寻找 阅读全文
posted @ 2021-11-21 17:55 linzeliang 阅读(322) 评论(0) 推荐(1) 编辑
摘要:题目 剑指 Offer 12. 矩阵中的路径 思路1(回溯、DFS) 这题可以使用回溯+递归来解决,思路如下: 将二维数组的每一个元素都作为起点进行回溯查找 每次查找的时候,都有四个方向,但是上一个方向不能再次被遍历,因此需要将遍历过的位置进行做标记,递归返回的时候再还原 递归过程中要判断一些条件: 阅读全文
posted @ 2021-11-21 01:40 linzeliang 阅读(61) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的节点,同时用pre记录上一个节点,直到当前两个栈顶节点不相等,那么pre节点就是他们开始相遇的地方 阅读全文
posted @ 2021-11-20 01:17 linzeliang 阅读(83) 评论(0) 推荐(0) 编辑
摘要:题目 剑指 Offer 25. 合并两个排序的链表 思路1 其实就是归并排序中将两个数组合并成一个有序数组 因为两个链表的元素已经是递增了(必要条件),所以我们可以遍历两个链表,判断两个节点的大小关系,然后交替前进,合并到一个新的链表中 因为需要返回一个合并后的新链表,同时我们也无法判断l1、l2两 阅读全文
posted @ 2021-11-19 02:02 linzeliang 阅读(36) 评论(0) 推荐(0) 编辑

1 2 3 4 5 ··· 7 下一页
点击右上角即可分享
微信分享提示
主题色彩