算法
文章平均质量分 59
結城
渴望着美好结局,却没能成为自己。
展开
-
leetcode 33. 搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。原创 2024-09-10 15:06:00 · 266 阅读 · 0 评论 -
leetcode 31. 下一个排列
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。那肯定是和尾部比它大的换,比和它小的换不会让数字变大,所以从尾部开始找第一个比它大的(位置j),两者交换。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。原创 2024-09-05 15:51:50 · 393 阅读 · 0 评论 -
leetcode 875. 爱吃香蕉的珂珂
珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。说实话,这题我不会,但看了题解后,看懂了一些,尝试写一下题解,这是道经典二分的题,要找的结果是最终的k,那么区间左端点代表速度最小值,右端点代表速度最大值,要找中间合适的 k。通常来讲的二分就是 找到 k==k,这里的判定条件是速度 k 能刚好吃完所有堆的香蕉,不过这种类型的二分需要找好分割边界条件的点和初始的左右端点。输入:piles = [30,11,23,4,20], h = 5。输入:piles = [30,11,23,4,20], h = 6。原创 2024-08-25 22:59:44 · 275 阅读 · 0 评论 -
leetcode 397. 整数替换
leetcode 397. 整数替换。原创 2024-08-12 23:35:18 · 360 阅读 · 0 评论 -
leetcode 124. 二叉树中的最大路径和
然后决定当前这个节点为根节点的树能达成的最大路径和是多少,然后再把这个节点作为最长路径的一部分的结果返上去,有点dp 那味。二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。输入:root = [-10,9,20,null,null,15,7]输入:root = [1,2,3]路径和 是路径中各节点值的总和。原创 2024-08-12 23:10:27 · 228 阅读 · 0 评论 -
leetcode 718. 最长重复子数组,leetcode 1143. 最长公共子序列
和两道十分相似的题,就不放题目了。原创 2024-08-05 21:32:41 · 318 阅读 · 0 评论 -
leetcode 139. 单词拆分
一定要有自己的思想,就算没有也多看看几个题解慢慢形成,拒绝思维定势的。原创 2024-08-02 11:19:14 · 343 阅读 · 0 评论 -
leetcode 450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。输入: root = [5,3,6,2,4,null,7], key = 0。输入:root = [5,3,6,2,4,null,7], key = 3。另一个正确答案是 [5,2,6,null,4,null,7]。输出:[5,4,6,2,null,null,7]输出: [5,3,6,2,4,null,7]原创 2024-07-27 10:01:47 · 247 阅读 · 0 评论 -
leetcode 106. 从中序与后序遍历序列构造二叉树
具体切分区间的方式利用了两个map,通过后序遍历的最后一个作为根节点找中序遍历切分点idx,然后根据中序遍历切分的两块区间去找后序遍历下一节点的两个区间。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输入:inorder = [-1], postorder = [-1]原创 2024-07-24 23:17:08 · 464 阅读 · 1 评论 -
leetcode 116. 填充每个节点的下一个右侧节点指针
这道题假设用层序遍历开一个队列来做其实非常的简单,但是他既然说了进阶要不开额外空间,这一点就值得考量了。实际上就是怎样才能去掉这个队列呢,那就必然得拿到下一个节点,这个可以借助父节点的next来做,因为遍历到下一层的时候,父节点的next是已知的。所以就一目了然了,这道题除了迭代外,还可以用递归。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。原创 2024-07-23 23:23:58 · 411 阅读 · 1 评论 -
leetcod 685. 冗余连接 II
输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]输入:edges = [[1,2],[1,3],[2,3]]原创 2024-03-17 10:46:56 · 539 阅读 · 0 评论 -
leetcode 309. 买卖股票的最佳时机含冷冻期
一开始陷入思维定势了,我就枚举出所有可能情况,也就是说具体买卖了多少次,于是有了第一版代码,结果耗时62ms。后来看了人家的发现,其实不需要知道具体买卖多少次,只要知道当前持有与否就够了。所以有了第二版代码0代表持有,1代表没有。给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格。解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入: prices = [1,2,3,0,2]原创 2024-02-27 10:34:51 · 197 阅读 · 0 评论 -
完全背包的遍历顺序问题,对于组合数和排列数的求解
如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。原创 2024-02-21 18:59:08 · 201 阅读 · 0 评论 -
leetcode 494. 目标和
那么两者a+b=sum,a-b=target,二式相加后可知就是找到把num数组中所有数之和为(sum+target)/2的方案,这里有两个坑,其中一个是sum+target要是偶数才行,另一个写在了代码注释里。例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1”。输入:nums = [1,1,1,1,1], target = 3。输入:nums = [1], target = 1。原创 2024-02-20 10:11:06 · 425 阅读 · 0 评论 -
背包问题的转化
这俩题乍一看都没啥思路,但实际上都是背包问题的转化。dp其实最难想的就是状态表示。416就是一个背包容量为集合全部元素求和除以2,看这个背包能不能装满。1049则是一个背包容量为集合全部元素求和除以2,看这书包最多能装多少(另外还有个坑,二维的f和一维的简化f要注意好,最好别跳步。原创 2024-01-30 15:20:34 · 237 阅读 · 0 评论 -
leetcode47,leetcode491,leetcode40,leetcode90,系列问题包你懂!!!Trie树对于排列问题、组合等结果集去重的应用
那么实际上,我们想一想,trie树就是一种很好的具有去重功能的数据结构,那么这些问题就都可以归结为建立一个trie树,然后从头读到叶子节点,然后对于具体问题就是看他的要求了,比如排列问题相当于没要求,非递减子序列则是要求trie树dfs过程元素一致单调不减,求和就是累计递归过程中节点的值与target值对比,子集则是递归过程中每读一个新节点我就存一次结果。这么一看是不是通透了,那么我们举一个例子,这个例子是leetcode491. 非递减子序列,也是我思考出这一思路的题,下面将是我逐步优化代码的过程。原创 2024-01-07 22:39:30 · 398 阅读 · 0 评论 -
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 地址。输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]输入:s = “101023”原创 2024-01-05 16:24:48 · 503 阅读 · 0 评论 -
leetcode 131. 分割回文串
因为没考虑所谓回文串aba是回文串,新的字符是c可能不是回文串,但再往后加可能是abacaba,这又是回文串了。看了剪枝操作,有了第三版,不用每次都判断回文串了,而是用一个数组存储各种情况,在本题中最长就16字符,所以效果不明显,之后这种空间换时间的思路还是要记得的。这题说实话,一开始合计的是一个个加进来,然后当前最后一个字符串加上新的字符是回文串就继续dfs,然后不管最后一个字符串加上新的字符是不是回文串这里都要断开。输出:[[“a”,“a”,“b”],[“aa”,“b”]]输出:[[“a”]]原创 2023-12-24 22:32:35 · 123 阅读 · 0 评论 -
leetcode 40. 组合总和 II
记录受影响以及没有融会贯通导致失败的。原创 2023-12-24 12:10:19 · 78 阅读 · 0 评论 -
leetcode 39. 组合总和
记录一个猪鼻时刻。原创 2023-12-23 15:15:48 · 98 阅读 · 0 评论 -
leetcode 450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。输入: root = [5,3,6,2,4,null,7], key = 0。输入:root = [5,3,6,2,4,null,7], key = 3。另一个正确答案是 [5,2,6,null,4,null,7]。输出:[5,4,6,2,null,null,7]输出: [5,3,6,2,4,null,7]原创 2023-12-19 22:23:06 · 111 阅读 · 0 评论 -
leetcode 236. 二叉树的最近公共祖先
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。解释:节点 5 和节点 1 的最近公共祖先是节点 3。原创 2023-12-15 10:51:52 · 97 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树
所以其实应该明白中序遍历是一个左中右的顺序,对应到二叉搜索树,自然就是一个升序序列了,所以写了这个。其实一开始思路是正常往左右分别遍历并且判断当前根节点和左右子树的大小关系,但是WA了。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。输入:root = [5,1,4,null,null,3,6]解释:根节点的值是 5 ,但是右子节点的值是 4。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。输入:root = [2,1,3]因为上面这个没考虑到情况。原创 2023-12-11 22:53:32 · 112 阅读 · 1 评论 -
leetcode 117. 填充每个节点的下一个右侧节点指针 II
看了两三次的。原创 2023-12-04 21:19:56 · 155 阅读 · 0 评论 -
leetcode 208. 实现 Trie (前缀树)
哈希擅长的是单值查找,对于查找符合前缀或者后缀的则不太在行,而且数据数量多起来后,每一个数据都要有自己的hashcode,还是比较占时间的。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);原创 2023-11-28 19:41:22 · 128 阅读 · 0 评论 -
leetcode 151. 反转字符串中的单词
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。s 中使用至少一个空格将字符串中的 单词 分隔开。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。**给你一个字符串 s ,请你反转字符串中 单词 的顺序。解释:反转后的字符串中不能存在前导空格和尾随空格。输入:s = “a good example”原创 2023-11-20 16:32:20 · 95 阅读 · 0 评论 -
leetcode 18. 四数之和
巨恶心的。转载 2023-11-18 15:44:23 · 42 阅读 · 0 评论 -
leetcode 15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,1,1]输入:nums = [0,0,0]解释:唯一可能的三元组和为 0。输出:[[0,0,0]]原创 2023-11-16 10:12:10 · 109 阅读 · 0 评论 -
leetcode 202.快乐数
乍一看没头绪,实际上从反向来,不是快乐数的话,会出现重复的计算结果,所以是一道考察集合的题目。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 n 是 快乐数 就返回 true;不是,则返回 false。对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。如果这个过程 结果为 1,那么这个数就是快乐数。编写一个算法来判断一个数 n 是不是快乐数。转载 2023-11-13 22:31:27 · 39 阅读 · 0 评论