自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 代码随想录算法训练营总结

时间过得真快,转眼间就过了两个月。很难相信我能坚持下来,但有点惭愧的是,后续任务完成的质量不高。自从二叉和回溯被递归做法给暴击后,心态发生了略微变化,后续题目很多都没啥思路,大体就是看会题目,然后直接看视频或题解,这样固然能快速掌握解题技巧,但大概率记不牢,很快就能忘记。算法确实是一个学无止境的过程,以前多次跟过视频学习,但都没做好规划;基本就是学了几天就放弃,过了一阵,等于白学。这一百多道题目属于我算法开始的基础,我会接着二刷三刷牢固,接下来,也期待卡子哥的算法视频,期待新的篇章,图论、dfs等。

2023-09-10 22:01:44 197

原创 代码随想录Day_60打卡

以每个柱子高度为基底,寻找最大的矩形,如以1为基底,可以贯彻整个数组,面积为1 * 6 = 6,图中最大的矩形面积则是以5为基底,在左右分别找第一个比5小的柱子,分别为2和1,则中间长度为2,有两个柱子大于等于5,矩形面积则为5 * 2 = 10,故可以使用单调栈思路。使用栈保存数组中未处理的柱子结点,维持栈中元素的降序,则保证了栈中下一个元素即为栈顶元素左边的第一根矮的柱子,当有遍历到的柱子低于栈顶元素时,此时可以求以栈顶元素为基底的矩形面积。求在该柱状图中,能够勾勒出来的矩形的最大面积。

2023-09-10 15:35:21 117

原创 代码随想录Day_59打卡

给定一个循环数组nums的下一个元素是nums[0]),返回 nums中每个元素的。数字x的是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。[2,-1,2]第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。思路:跟之前的每日温度类似,就是寻找右边第一个更大的数,这道题就是多了个循环操作,即最右边的数的下一个元素可以从数组中从头开始找。

2023-09-08 15:49:43 182

原创 代码随想录Day_58打卡

给定一个整数数组,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。思路:创建一个栈,遍历数组temperatures,保持栈是单调的(递增);此时栈顶元素就是未处理的元素中最冷的一天,若遇到高温 > 栈顶元素,则处理栈顶元素,res[stack.peek()] = i - stack.peek(),这样遍历完整个数组,就得到答案。单调栈就是保存了未处理的结点(还没遇到更高气温),方便后续赋值。

2023-09-07 22:00:57 167

原创 代码随想录Day_57打卡

给你一个字符串s,请你统计并返回这个字符串中的数目。是正着读和倒过来读一样的字符串。是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。s = "abc"3三个回文子串: "a", "b", "c"思路:使用动态规划,dp为二维数组,以第一二维切割字符串。如dp[i][j]表示字符串s下标从i到j是否为回文字串,统计所有dp[i][j]为true的个数。

2023-09-07 20:37:00 126

原创 代码随想录Day_56打卡

给定两个单词word1和word2,返回使得word1和word2所需的。可以删除任意一个字符串中的一个字符。2第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"思路:使用动态规划,dp定义为:dp[i][j]表示word1从0到i - 1要跟word2从0到j - 1相同的最小删除次数。若word1[i - 1] == word2[j - 1],则此时不需要删除,dp[i][j] = dp[i - 1][j - 1]。

2023-09-07 19:56:53 314

原创 代码随想录Day_55打卡

给定字符串和,判断是否为的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?true思路:使用动态规划,其实就是跟之前一样寻找不连续的公共字符,若公共字符数量达到整个字符串s,就说明s是t的子序列。

2023-09-07 17:22:52 197

原创 代码随想录Day_53打卡

给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。3最长公共子序列是 "ace" ,它的长度为 3。思路:使用动态规划,跟最长重复子数组类似,由左上角推导而来。由于这道题不用求连续子序列,但两层for循环都是字符串从左往右遍历;

2023-09-03 20:35:37 134

原创 代码随想录Day_52打卡

给你一个整数数组nums,找到其中最长严格递增子序列的长度。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组的子序列。4最长递增子序列是 [2,3,7,101],因此长度为 4。思路:使用动态规划,dp含义:dp[i]表示数组nums到下标为i时的最长递增子序列,由于涉及到删除数字,故每个数字都应该往前面比较,故在赋值时,应取dp[i]和dp[j] + 1的最大值。

2023-09-03 16:16:43 346

原创 代码随想录Day_51打卡

给定一个整数数组prices,其中第prices[i]表示第i天的股票价格。​设计一个算法计算出最大利润。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。3对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路:剖析股票的几种状态:持有股票状态、不持有股票状态,其中不持有股票状态可以分为3种:今天刚买出股票、冷冻期、渡过冷冻期。其中,冷冻期由前一天卖出股票形成。故可以使用动态规划,在第二维度上划分出这四种状态,然后进行状态转化。

2023-09-03 15:20:47 126

原创 代码随想录Day_50打卡

给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成交易。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。6在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。思路:跟前面两道买卖股票一致,使用动态规划。

2023-08-30 16:26:37 48

原创 代码随想录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 93

原创 代码随想录Day_48打卡

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。[1,2,3,1]4偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。

2023-08-28 17:05:43 226

原创 代码随想录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 75

原创 代码随想录Day_45打卡

假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?n = 22有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶思路:之前用动态规划做过了,就是用dp数组保存i个阶梯拥有的方法,然后向前累加两个方法数量即可。进阶:使用完全背包思想,一次跳一阶两阶可以视为物品,由于可以重复使用,故使用完全背包。动态规划:dp定义及含义:dp[j]表示跳到第j个阶梯所拥有的方法数。

2023-08-28 15:15:20 76

原创 代码随想录Day_44打卡

给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。4有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+1思路:使用动态规划,跟之前的01背包问题不同的是,单一金额可以多次使用,称为完全背包问题。只要遍历背包容量的时候正序遍历即可,因为背包是得依靠前面容量赋值的,正序遍历可重复使用物品。

2023-08-24 16:37:27 80

原创 代码随想录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 48

原创 代码随想录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 26

原创 代码随想录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 24

原创 代码随想录Day_39打卡

一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

2023-08-19 16:52:24 71

原创 代码随想录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 34

原创 代码随想录Day37_打卡

当且仅当每个相邻位数上的数字x和y满足x 29),这样的话,每次数值改变都会影响递增的判断,故可从后面遍历判断,维持了数字结果且不对前面产生影响。

2023-08-19 15:03:06 77

原创 代码随想录Day_36打卡

给定一个区间的集合intervals,其中。返回需要移除区间的最小数量,使剩余区间互不重叠。1移除 [1,3] 后,剩下的区间没有重叠。思路:跟上一题的射箭类似,for循环遍历数组,统计下重复区间,然后返回重复区间即可。具体做法:为了使重复区间尽量紧凑,首先将数组排序,根据左边界排序,此时 重复区间逻辑为: intervals[i][0] < pre,pre即为重复区间的右边界,每次重复时,取最小右边界。若开始新的区间统计,则要刷新pre的值。

2023-08-19 12:40:59 35

原创 代码随想录Day_35打卡

在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。注意,一开始你手头没有任何零钱。给你一个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false。true前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。

2023-08-15 12:13:53 80

原创 代码随想录Day34打卡

给你一个整数数组nums和一个整数kinums[i]-nums[i]重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数组。5选择下标 1 ,nums 变为 [4,-2,3]。思路:负数取反对于数组总和有增益的作用,而负数越小增益越大,并且可以对同一个数多次取反,故最坏情况也就是将一个自然数取负。

2023-08-14 15:18:07 31

原创 代码随想录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 55

原创 代码随想录Day_31打卡

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果,我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。1你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。

2023-08-11 15:24:34 36

原创 代码随想录Day_30打卡

回溯算法本质是一种暴力算法,通过递归穷举数组的结点,通过处理各种结点,返回想要的结果。由于利用递归,故回溯算法的处理情况可以理解成一颗N叉树,通过剪枝,取得想要的叶子结点(结果)。ps : 以[1,2,3]为例:...表示在单层逻辑中,不同的递归处理可能产生不同的结点。

2023-08-10 16:35:16 33

原创 代码随想录Day29打卡

给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。思路:采用回溯算法,再往临时List<Integer> tmp中添加数之前,判断当前数是否大于tmp中最大的数(即最后一个数),若符合,则加入。去重操作,由于排序会使得递增子序列发生改变(增多),故之前的标记法无法使用,可以使用hashmap映射。在每层单层逻辑中,判断当前hashmap中是否包含该数,若包含,则跳过。

2023-08-09 19:50:50 17

原创 代码随想录Day_28打卡

正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s,用以表示一个 IP 地址,返回所有可能的,这些地址可以通过在s中插入'.'来形成。你重新排序或删除s中的任何数字。你可以按顺序返回答案。思路:原题给的参数需要进行切割,判断然后拼凑成一个合法的ip地址。采用回溯算法,在递归切割的时候依次判断切割完的子字符串是否符合规则,若不符合,直接结束,若符合,则添加到结果集中,由于ip地址只包含4个整数,故递归只需要递归到第三层。

2023-08-08 22:18:30 38

原创 代码随想录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 96

原创 代码随想录Day_25打卡

找出所有相加之和为n的k返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。= 3,= 7[[1,2,4]]没有其他符合的组合了。思路:采用回溯算法,在组合长度等于k的时候判断是否为符合要求的组合(sum == n),当组合长度大于k时,就没必要继续添加了,直接return结束。参数可以多增加一个curSum,记录当前组合tmp中的总和,节省时间。

2023-08-05 14:38:57 28

原创 代码随想录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 18

原创 代码随想录Day_23打卡

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

2023-08-03 14:23:26 27

原创 代码随想录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 21

原创 代码随想录Day_21打卡

给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。1思路:利用二叉搜索树中序遍历为升序的特性,在中序遍历二叉搜索树的时候,判断相邻差值,记录最小值。注释部分代码为递归做法。

2023-08-01 22:44:27 25 1

原创 代码随想录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 31 1

原创 代码随想录Day_18打卡

给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。1。

2023-07-29 01:09:32 36

原创 代码随想录Day_17打卡

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。事例:true思路:平衡性取决于树的左右两边的高度,要遍历所有子树,确保所有子树都平衡,故递归采用左右中顺序遍历,若有其中一颗子树不平衡,则不用判断,一直返回特殊结果表示为不平衡树,故可以用-1代替高度代表不平衡。(做法跟求高度类似,边求高度边判断是否平衡)。

2023-07-27 22:53:07 23 1

原创 代码随想录Day_16打卡

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点是指没有子节点的节点。事例:给定二叉树3/ \9 20/ \15 7返回它的最大深度 3。思路:迭代:使用层序遍历,在队列中的每次for循环就是每层个数的遍历,在for循环之前自增层数,最终得到的就是二叉树的最大深度。递归:二叉树的最大深度就是左右子树的最大深度加1(当前层数),故当做黑盒问题,依次递归求得左右子树,最后得到最大值 + 1,递归终止条件为 root == null。

2023-07-27 11:34:50 22 1

空空如也

空空如也

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

TA关注的人

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