![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法专栏
文章平均质量分 86
简要记录代码随想录的打卡记录。
kk_try_hard
这个作者很懒,什么都没留下…
展开
-
代码随想录Day_46打卡
创建dp数组,dp[i]表示字符串s从下标0到i之间是否能有wordDict组成。dp[i]依赖于物品中的某个单词是否匹配以及dp[i - word.length()],故在遍历背包的过程中需要将s进行切割,然后再判断是否有单词匹配,可以用hash映射单词物品,节省时间。状态转移方程:dp[j]为真以及s从j到i截取的单词能被匹配,则dp[i] = true。dp定义及含义:dp[i]表示s字符串下标从0到i之间是否有单词匹配。初始化:dp[0] = true,空串为真,才方便后续单词进行匹配。原创 2023-08-28 15:52:46 · 79 阅读 · 0 评论 -
代码随想录Day_48打卡
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。[1,2,3,1]4偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。原创 2023-08-28 17:05:43 · 255 阅读 · 0 评论 -
代码随想录Day_39打卡
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?原创 2023-08-19 16:52:24 · 83 阅读 · 0 评论 -
代码随想录Day_41打卡
给定一个正整数n,将其拆分为k个的和(k >= 2),并使这些整数的乘积最大化。返回你可以获得的最大乘积。n = 21思路:n拆分成k个数,即n拆分成的因子的最大乘积可能之前得到过,例如:10 = 3 + 7,而7的最大拆分乘积=3 + 4 (3 * 4)。故可以用动态规划对数进行拆分求值,从2到n之间拆分,最终的dp[n]即为所要的结果。原创 2023-08-23 15:16:51 · 27 阅读 · 0 评论 -
代码随想录Day_49打卡
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。5在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。原创 2023-08-29 14:06:37 · 112 阅读 · 0 评论 -
代码随想录Day_42打卡
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。动态规划:创建一个二维数组dp[i][j],其中i表示物品的序号,j表示当前背包的容量,dp[i][j]表示使用0-i下标的物品,背包容量为j的最大价值总和。原创 2023-08-23 16:29:49 · 28 阅读 · 0 评论 -
代码随想录Day_38打卡
(通常用F(n)表示)形成的序列称为。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n,请计算F(n)。原创 2023-08-19 16:24:44 · 49 阅读 · 0 评论 -
代码随想录Day_43打卡
有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。x == yx!= yxyy-x最后,石头。返回此石头。如果没有石头剩下,就返回0。1组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],原创 2023-08-24 15:52:59 · 54 阅读 · 0 评论 -
代码随想录Day37_打卡
当且仅当每个相邻位数上的数字x和y满足x 29),这样的话,每次数值改变都会影响递增的判断,故可从后面遍历判断,维持了数字结果且不对前面产生影响。原创 2023-08-19 15:03:06 · 99 阅读 · 0 评论 -
代码随想录Day_45打卡
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?n = 22有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶思路:之前用动态规划做过了,就是用dp数组保存i个阶梯拥有的方法,然后向前累加两个方法数量即可。进阶:使用完全背包思想,一次跳一阶两阶可以视为物品,由于可以重复使用,故使用完全背包。动态规划:dp定义及含义:dp[j]表示跳到第j个阶梯所拥有的方法数。原创 2023-08-28 15:15:20 · 91 阅读 · 0 评论 -
代码随想录Day_36打卡
给定一个区间的集合intervals,其中。返回需要移除区间的最小数量,使剩余区间互不重叠。1移除 [1,3] 后,剩下的区间没有重叠。思路:跟上一题的射箭类似,for循环遍历数组,统计下重复区间,然后返回重复区间即可。具体做法:为了使重复区间尽量紧凑,首先将数组排序,根据左边界排序,此时 重复区间逻辑为: intervals[i][0] < pre,pre即为重复区间的右边界,每次重复时,取最小右边界。若开始新的区间统计,则要刷新pre的值。原创 2023-08-19 12:40:59 · 37 阅读 · 0 评论 -
代码随想录Day_35打卡
在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。注意,一开始你手头没有任何零钱。给你一个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false。true前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。原创 2023-08-15 12:13:53 · 109 阅读 · 0 评论 -
代码随想录Day_44打卡
给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。4有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+1思路:使用动态规划,跟之前的01背包问题不同的是,单一金额可以多次使用,称为完全背包问题。只要遍历背包容量的时候正序遍历即可,因为背包是得依靠前面容量赋值的,正序遍历可重复使用物品。原创 2023-08-24 16:37:27 · 102 阅读 · 0 评论 -
代码随想录Day_31打卡
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果,我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。1你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。原创 2023-08-11 15:24:34 · 42 阅读 · 0 评论 -
代码随想录Day_32打卡
引用int cover记录当前最大的覆盖范围,遍历数组到cover,按每次跳跃取最大值,即下一步为nums[i] + i,实时更新cover,当cover覆盖最后一格时返回true,当for循环执行完还没返回结果时,返回false。遍历数组,当i到达curMax时,意味着不得不再跳一次,此时res++,将curMax更新为nextMax,若nextMax覆盖最后一个数,则返回结果。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。跳到最后一个位置的最小跳跃数是 2。原创 2023-08-12 13:27:56 · 59 阅读 · 0 评论 -
代码随想录Day34打卡
给你一个整数数组nums和一个整数kinums[i]-nums[i]重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数组。5选择下标 1 ,nums 变为 [4,-2,3]。思路:负数取反对于数组总和有增益的作用,而负数越小增益越大,并且可以对同一个数多次取反,故最坏情况也就是将一个自然数取负。原创 2023-08-14 15:18:07 · 33 阅读 · 0 评论 -
代码随想录Day_30打卡
回溯算法本质是一种暴力算法,通过递归穷举数组的结点,通过处理各种结点,返回想要的结果。由于利用递归,故回溯算法的处理情况可以理解成一颗N叉树,通过剪枝,取得想要的叶子结点(结果)。ps : 以[1,2,3]为例:...表示在单层逻辑中,不同的递归处理可能产生不同的结点。原创 2023-08-10 16:35:16 · 37 阅读 · 0 评论 -
代码随想录Day29打卡
给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。思路:采用回溯算法,再往临时List<Integer> tmp中添加数之前,判断当前数是否大于tmp中最大的数(即最后一个数),若符合,则加入。去重操作,由于排序会使得递增子序列发生改变(增多),故之前的标记法无法使用,可以使用hashmap映射。在每层单层逻辑中,判断当前hashmap中是否包含该数,若包含,则跳过。原创 2023-08-09 19:50:50 · 20 阅读 · 0 评论 -
代码随想录Day_28打卡
正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s,用以表示一个 IP 地址,返回所有可能的,这些地址可以通过在s中插入'.'来形成。你重新排序或删除s中的任何数字。你可以按顺序返回答案。思路:原题给的参数需要进行切割,判断然后拼凑成一个合法的ip地址。采用回溯算法,在递归切割的时候依次判断切割完的子字符串是否符合规则,若不符合,直接结束,若符合,则添加到结果集中,由于ip地址只包含4个整数,故递归只需要递归到第三层。原创 2023-08-08 22:18:30 · 44 阅读 · 0 评论 -
代码随想录Day_25打卡
找出所有相加之和为n的k返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。= 3,= 7[[1,2,4]]没有其他符合的组合了。思路:采用回溯算法,在组合长度等于k的时候判断是否为符合要求的组合(sum == n),当组合长度大于k时,就没必要继续添加了,直接return结束。参数可以多增加一个curSum,记录当前组合tmp中的总和,节省时间。原创 2023-08-05 14:38:57 · 31 阅读 · 0 评论 -
代码随想录Day_27打卡
给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。candidates中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。target = 72 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。7 也是一个候选, 7 = 7。仅有这两种组合。原创 2023-08-07 15:57:07 · 101 阅读 · 0 评论 -
代码随想录Day_24打卡
目标组合的size为k,故在tmp添加i的时候,当前组合tmp所缺的个数为k - tmp.size(),遍历到i时,只能递归添加后面的数,故当前的剩余数为n - i + 1,满足n - i + 1>k - tmp.size()时,才有必要递归添加。即修改for循环的条件为: i <= n - (k - tmp.size()) + 1,可以优化效率。故需要才用回溯思想,即在递归的条件下套用for循环,递归结束为当前组合满足题设k,for循环中处理单层递归,回溯。原创 2023-08-04 23:06:20 · 20 阅读 · 0 评论 -
代码随想录Day_23打卡
给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在中。修剪树改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。原创 2023-08-03 14:23:26 · 30 阅读 · 0 评论 -
代码随想录Day_22打卡
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]6节点 2 和结点 8 的最近公共祖先为结点 6。思路:普通二叉树的最近公共祖先需要自底向上查询,即后序遍历先收集左右子树结果最终返回。原创 2023-08-02 20:47:18 · 24 阅读 · 0 评论 -
代码随想录Day_21打卡
给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。1思路:利用二叉搜索树中序遍历为升序的特性,在中序遍历二叉搜索树的时候,判断相邻差值,记录最小值。注释部分代码为递归做法。原创 2023-08-01 22:44:27 · 26 阅读 · 1 评论 -
代码随想录Day_17打卡
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。事例:true思路:平衡性取决于树的左右两边的高度,要遍历所有子树,确保所有子树都平衡,故递归采用左右中顺序遍历,若有其中一颗子树不平衡,则不用判断,一直返回特殊结果表示为不平衡树,故可以用-1代替高度代表不平衡。(做法跟求高度类似,边求高度边判断是否平衡)。原创 2023-07-27 22:53:07 · 25 阅读 · 1 评论 -
代码随想录Day_18打卡
给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。1。原创 2023-07-29 01:09:32 · 39 阅读 · 0 评论 -
代码随想录Day_20打卡
给定一个不重复的整数数组nums。可以用下面的算法从numsnums返回 nums构建的最大二叉树。递归调用如下所示:- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- 空数组,无子节点。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- 空数组,无子节点。- 只有一个元素,所以子节点是一个值为 1 的节点。原创 2023-07-30 22:18:57 · 34 阅读 · 1 评论 -
代码随想录Day_16打卡
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点是指没有子节点的节点。事例:给定二叉树3/ \9 20/ \15 7返回它的最大深度 3。思路:迭代:使用层序遍历,在队列中的每次for循环就是每层个数的遍历,在for循环之前自增层数,最终得到的就是二叉树的最大深度。递归:二叉树的最大深度就是左右子树的最大深度加1(当前层数),故当做黑盒问题,依次递归求得左右子树,最后得到最大值 + 1,递归终止条件为 root == null。原创 2023-07-27 11:34:50 · 25 阅读 · 1 评论 -
代码随想录Day_15打卡
给你二叉树的根节点root,返回其节点值的。(即逐层地,从左到右访问所有节点)。思路:层次遍历是自上而下,从左到右的遍历,符合队列的先进先出原则。故可以借助队列,将头结点压入队列,然后判断队列是否为空,若不为空则从队列中弹出,再处理该结点,依次弹入左右节点。每次循环次数为该层结点个数,而当我们处理完结点后,每个结点的左右孩子都被压入,故每次循环次数为当前队列所拥有的size个数。原创 2023-07-26 14:28:10 · 45 阅读 · 1 评论 -
代码随想录day_14打卡
给你二叉树的根节点root,返回它节点值的遍历。原创 2023-07-26 00:29:36 · 29 阅读 · 1 评论 -
代码随想录Day_11打卡
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。原创 2023-07-22 12:03:29 · 29 阅读 · 0 评论 -
代码随想录day_13打卡
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。原创 2023-07-24 17:50:56 · 92 阅读 · 0 评论 -
代码随想录Day_10打卡
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true;原创 2023-07-21 12:22:45 · 27 阅读 · 1 评论 -
代码随想录Day_9打卡
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。力扣(LeetCode)链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string事例:输入:haystack = "sadbutsad", needle = "sad"原创 2023-07-20 23:24:24 · 43 阅读 · 0 评论 -
代码随想录Day_8打卡
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。力扣(LeetCode)链接:https://leetcode.cn/problems/reverse-string思路:利用双指针left和right分别指向头和尾,交换left和right的值,交换后left向前进,right向后进,当left遇上或超过right的时候,字符串反转完成。原创 2023-07-19 14:58:06 · 28 阅读 · 0 评论 -
代码随想录Day_7
力扣(LeetCode)链接:https://leetcode.cn/problems/4sum-ii解析: 使用哈希表,套用两个for循环先将nums1和nums2两个数组的和保存,再套用两个for循环判断nums3和nums4两个数组是否存在哈希表中的值的负数。其实两次套用for循环就是把四数和转变为两数之和,哈希表的使用跟两数之和一样,不同的是,此题目要返回符合的元组,而哈希表又不能重复,故需要使用HashMap,其中的value值保存出现的次数,最后将符合的value相加再返回。代码:原创 2023-07-18 23:21:37 · 38 阅读 · 1 评论 -
代码随想录Day_6打卡
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。力扣(LeetCode)链接:https://leetcode.cn/problems/valid-anagramsttrue思路:①、将两字符串转化为数组,排序后比较,若全程相等,则互为字母异位词,若不是,则不互为字母异位词。原创 2023-07-17 17:52:21 · 29 阅读 · 1 评论 -
代码随想录Day_4打卡
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。力扣(LeetCode)链接:https://leetcode.cn/problems/swap-nodes-in-pairs/[2,1,4,3]分析:这道题需要我们相邻两个结点做交换,然后依次迭代。就以上图为例,我们首先交换结点1和2,变为2-1-3-4,然后交换三四结点得到结果2-1-4-3。原创 2023-07-15 13:16:51 · 50 阅读 · 1 评论 -
代码随想录Day_3打卡
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足的节点,并返回。力扣(LeetCode) 链接:https://leetcode.cn/problems/remove-linked-list-elements/思路:①、创建一个带有头结点的res指针,遍历一边链表,若链表不为删除的结点,则直接添加到res指针。原创 2023-07-14 16:20:10 · 94 阅读 · 1 评论