自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AAS48的博客

算法之路

  • 博客(322)
  • 收藏
  • 关注

原创 Leetcode 231. 2 的幂(位运算)

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true;否则,返回 false。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。2、如果一个数要想为2的幂,必然有 (n & n-1) == 0。这是因为2的幂的数,它减一之后必然所有位(除最高位外)都是1.【思路】:循环的方法就不说了,这里主要提一提位运算的思路。1、如果某个数为负数,那么肯定不是2的幂。代码可以一行搞定了。

2022-09-14 12:13:53 86

原创 Leetcode 2269. 找到一个数字的 K 美丽值(滑动窗口)

给你整数 num 和 k ,请你返回 num 的 k 美丽值。一道很明显的滑动窗口题。这个技巧学会之后解这类问题确实非常容易。一个 子字符串 是一个字符串里的连续一段字符序列。子字符串能整除 num。子字符串长度为 k。允许有 前缀 0。0 不能整除任何值。

2022-09-13 18:58:38 227

原创 剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口)

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。给定一个含有 n 个正整数的数组和一个正整数 target。

2022-09-13 18:50:08 89

原创 239. 滑动窗口最大值(滑动窗口)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。如果最大值还存在于窗口内部,其实就可以根据情况直接过。每次只需要比较新加入的nums[right]和max谁大即可。当left > maxindex时,即最大值已经离开滑动窗口了,那么就得从头更新一遍最大值了。我发现其实并不是每次都要从头搜整个窗口内的元素。返回 滑动窗口中的最大值。

2022-09-13 15:46:34 136

原创 1387. 将整数按权重排序(记忆化搜索)

你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。12 的权重为 9(12 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)搜的过程中如果把6的结果记录下来,那么12就是在它的基础上加1即可。

2022-09-13 13:24:31 101

原创 剑指 Offer II 043. 往完全二叉树添加节点(层次遍历)

CBTInserter.insert(int v) 向树中插入一个新节点,节点类型为 TreeNode,值为 v。使树保持完全二叉树的状态,并返回插入的新节点的父节点的值;完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第 n 层有 2n-1 个节点)的,并且所有的节点都尽可能地集中在左侧。CBTInserter(TreeNode root) 使用根节点为 root 的给定树初始化该数据结构;CBTInserter.get_root() 将返回树的根节点。这样找父亲的话会非常方便。

2022-09-11 12:42:43 305

原创 Leetcode 628. 三个数的最大乘积

然后如果有负数产生最大值,必然是负数的个数大于等于2,且最小的两个负数乘一个最大的正数,这个值称为fumax。给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。所以我是这样想的,首先取出三个最大的数相乘:作为zhengmax。如果单纯排序取最大的三个数相乘,又会有负数的情况。最后比较zhengmax 和fumax谁大即可。常规思路三重循环超时。

2022-09-10 17:20:01 118

原创 Leetcode 669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。递归即可,不用想复杂了。

2022-09-10 14:42:21 78

原创 Leetcode 1395. 统计作战单位数 (DP)

作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0

2022-09-10 14:05:23 83

原创 剑指 Offer II 092. 翻转字符(DP,详细分析)

如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。如果我这一位是1,想翻1串,那么两种情况:1、前面i-1位翻成1串,然后我不用动。如果想翻1串,那么有两种情况:第一种情况、前面i-1位翻成1串,然后我也翻一下:即dp[i-1].one + 1。

2022-09-09 18:07:23 208

原创 Leetcode 946. 验证栈序列(经典题目)

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false。这个问题是一个经典的数据结构题目。分多种情况进行模拟即可。

2022-09-09 16:16:23 97

原创 Leetcode 1094. 拼车 (模拟题的技巧)

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi。想象一下,你自己是司机,你载客人的过程是什么。是不是每到一站,然后就看这一站有没有人上车有没有人下车,而且是先下后上的顺序。当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。如果车上座位满了,你就会跟乘客说,对不起满员了…

2022-09-09 14:21:48 334

原创 Leetcode 894. 所有可能的真二叉树(较难的DP,代码量大)

给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0。比如dp[7]的所有情况都是建立在dp[5]的基础上的。因为在所有n=5的子树下面找叶子节点挂两个节点,就变成n=7的一个解了。答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表。真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。但是思路其实不算很难,偶数时肯定没有,主要是奇数情况。所谓重复指的是,结构相同的树。

2022-09-08 19:25:34 216

原创 剑指 Offer II 091. 粉刷房子(巧妙的实现DP)

当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。输入: costs = [[17,2,17],[16,16,5],[14,3,19]]解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。请计算出粉刷完所有房子最少的花费成本。

2022-09-08 17:31:44 135

原创 Leetcode 2327. 知道秘密的人数(思路很棒)

给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后,每天 给一个新的人 分享 秘密。同时给你一个整数 forget ,表示每个人在发现秘密 forget 天之后会 忘记 这个秘密。一个人 不能 在忘记秘密那一天及之后的日子里分享秘密。给你一个整数 n ,请你返回在第 n 天结束时,知道秘密的人数。第一天有一个人知道秘密,arr[1] = 1。因此,我们只需要一个空间在forget +2级别的数组。这是我自己想出来的一个办法:用一个数组解决。在第 1 天,有一个人发现了一个秘密。

2022-09-08 13:03:33 566

原创 Leetcode 1518. 换酒问题(经典趣味题)

小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。请你计算 最多 能喝到多少瓶酒。

2022-09-08 12:17:50 107

原创 Leetcode 1823. 找出游戏的获胜者(约瑟夫环,数组实现法)

确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1

2022-09-07 14:41:29 170

原创 Leetcode 1609. 奇偶树(层次遍历BFS)

由于 0 层和 2 层上的节点值都是奇数且严格递增,而 1 层和 3 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。输入:root = [1,10,4,3,null,7,9,12,8,6,null,null,2]注意判断条件:1、奇数层要求所有节点都是偶数,偶数层要求所有节点都是奇数。偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增。3 层:[12,8,6,2]

2022-09-06 13:10:10 79

原创 Leetcode 802. 找到最终的安全状态(DFS + 记忆化搜索)

图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。如果一个节点没有连出的有向边,则它是 终端节点。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点。判断一个节点是否是安全节点:1、如果其出度是终端节点,没问题。输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]节点 5 和节点 6 是终端节点,因为它们都没有出边。

2022-09-06 12:41:30 190

原创 leetcode 419. 甲板上的战舰(广搜)

换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造,其中 k 可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰)。给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ ,返回在甲板 board 上放置的 战舰 的数量。输入:board = [[“X”,“.”,“.”,“X”],[“.”,“.”,“.”,“X”],[“.”,“.”,“.”,“X”]]

2022-09-05 17:01:08 107

原创 Leetcode 1020. 飞地的数量 (广搜模板题)

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。如果其中有一个节点到达边界,那么最后返回节点个数。搜索的过程中要记录节点个数。

2022-09-05 13:10:26 124

原创 Leetcode 1584. 连接所有点的最小费用(手撸普利姆算法)

连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi]。可以把set想象成一个大岛屿,每次都是找其他节点到这个大岛屿的最短距离,找到后把该节点并入这个大岛屿。请你返回将所有点连接的最小总费用。输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]

2022-09-05 12:13:01 290

原创 Leetcode 剑指 Offer II 063. 替换单词 (字典前缀树模板修改)

在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。注意:在建立词根的时候,要在单词末尾加一步,设置一个dicFin的布尔值,表示这里是词根的结束。现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。搜索过程中,如果看到dicFin直接返回。

2022-09-04 14:00:34 183

原创 Leetcode 646. 最长数对链(简单DP)

现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。在每一个数对中,第一个数字总是比第二个数字小。解释:最长的数对链是 [1,2] -> [3,4]输入:[[1,2], [2,3], [3,4]]但是要注意,要先排序!所以结合了一点点贪心。这样递推式就非常简单了。

2022-09-03 12:33:58 113

原创 Leetcode 867. 转置矩阵(简单模拟)

给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。输入:matrix = [[1,2,3],[4,5,6]]输出:[[1,4,7],[2,5,8],[3,6,9]]输出:[[1,4],[2,5],[3,6]]

2022-09-03 10:50:06 123

原创 Leetcode 1261. 在受污染的二叉树中查找元素(简单递归)

【代码】Leetcode 1261. 在受污染的二叉树中查找元素(简单递归)

2022-09-02 16:13:39 196

原创 Leetcode 526. 优美的排列 (回溯)

假设有从 1 到 n 的 n 个整数。因此我们没有必要每次在最后时刻再判断,如果一开始就不是优美排列,就没有必要搜索下去了。给你一个整数 n ,返回可以构造的 优美排列 的 数量。因为要想整个数组都是优美排列,必须保证,其子数组也是。事实证明,这个剪枝策略带来的优化效果是巨大的!注:如果每次都是搜到最后才判断,则会超时!与全排列思路基本一致,最后加个判断即可。perm[i] 能够被 i 整除。i 能够被 perm[i] 整除。所以我们用一个剪枝的手法。

2022-09-02 15:52:13 668

原创 面试题 04.03. 特定深度节点链表(链表+层次遍历)

给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。先用层次遍历确定 哪些节点在哪些层次上。提示:单链表插入时可以用一个尾指针,比较方便。最后返回的结果是:若干条链表。所谓链表数组,意思就是,再构造每一层的链表。

2022-09-01 22:06:08 189

原创 797. 所有可能的路径(深搜回溯)

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3。输入:graph = [[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]]...

2022-09-01 13:41:14 132

原创 面试题 08.10. 颜色填充(广搜模板)

待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor。从起点开始向四个方向泛洪。只要发现有目标颜色的点,就把他替换成newColor。「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。...

2022-09-01 13:08:24 59

原创 Leetcode 684. 冗余连接(并查集模板)

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。如果缺少某一条边的情况下,仍能让所有节点都处于一个集合内,那么就说明这条边是冗余的。...

2022-08-31 15:51:03 185

原创 LCP 51. 烹饪料理(回溯)

勇者背包内共有编号为 0 ~ 4 的五种食材,其中 materials[j] 表示第 j 种食材的数量。通过这些食材可以制作若干料理,cookbooks[i][j] 表示制作第 i 种料理需要第 j 种食材的数量,而 attribute[i] = [x,y] 表示第 i 道料理的美味度 x 和饱腹感 y。每次递归去搜,因为每道菜只能做一次,所以要用一个vis数组,记录某道菜是否被做过。欢迎各位勇者来到力扣城,城内设有烹饪锅供勇者制作料理,为自己恢复状态。此题思路没什么难的,和全排列基本一样。...

2022-08-31 13:52:16 134

原创 598. 范围求和 II (脑筋急转弯)

给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0

2022-08-30 14:39:21 137

原创 Leetcode 剑指 Offer II 110. 所有路径(DFS)

graph 的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。给定一个有 n 个节点的有向无环图,用二维数组 graph 表示,请找到所有从 0 到 n-1 的路径并输出(不要求按顺序)。每次深搜它相邻的节点。...

2022-08-29 00:15:44 226

原创 Leetcode 1827. 最少操作使数组递增(贪心)

我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0

2022-08-26 23:11:01 227

原创 Leetcode 35. 搜索插入位置(二分)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。请必须使用时间复杂度为 O(log n) 的算法。当low和high相等的时候有三种情况。本题是一道非常适合用二分查找解决的问题。...

2022-08-26 16:07:16 143

原创 Leetcode 105. 岛屿的最大面积(DFS)

输入: grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]找到给定的二维数组中最大的岛屿面积。..

2022-08-25 21:54:36 103

原创 Leetcode 208. 实现 Trie (字典前缀树)

boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);void insert(String word) 向前缀树中插入字符串 word。Trie() 初始化前缀树对象。

2022-08-25 13:10:31 72

原创 Leetcode 79. 单词搜索(迷宫回溯)

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”

2022-08-24 16:33:59 157

原创 Leetcode 93. 复原 IP 地址(回溯)

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。我们需要注意的几个点就是:所切下来的第一个字符串,它必须满足IP字符串的条件,即值在0—255之间。如果它是IP字符串,那么我们才搜后面的。

2022-08-24 15:55:53 625

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除