自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法二刷第一天(待写)

1移除元素还是不会,得多刷几次。2二分查找成功写出来了。

2024-01-31 18:16:21 529

原创 代码随想录一刷总结

十一月份报了卡哥的代码训练营,总计两个月,收获颇丰。

2024-01-29 20:42:09 506

原创 单调栈最后一天

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。

2024-01-29 20:17:39 464

原创 单调栈第二天

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。遇到第一个比栈顶大的元素时,弹出栈顶做记录,再利用当前遍历到的值计算差值和下标差值。若当前比栈里的大,则弹出,栈顶下标对应的第一个最大值为栈里的值。用单调栈,没想清楚处理逻辑,要怎么计算雨水。

2024-01-26 21:49:02 746

原创 单调栈第一天

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。我的做法是遍历完nums2后看stack中是否还有剩余,若有剩余,遍历stack,看剩下的元素是否在nums1中出现过,若出现过,则将目标值的下标置为-1。遍历nums2数组,使用一个栈,用栈记录我们遍历过的元素,栈里的记录遵循递增or递减。遍历数组,使用一个栈,用栈记录我们遍历过的元素,栈里的记录遵循递增or递减。

2024-01-25 20:34:32 869

原创 动态规划最后一天(回文串)

若i>j-1,则dp[i][j] = dp[i+1][j-1](看i,j中间的是否是回文串)用动态规划,若i==j 则看i和j之间是否是回文串,如果是回文则dp[i][j]也是回文。若s[i]==s[j] 则dp[i][j] = dp[i+1][j-1]dp[i][j] 依赖于 dp[i+1][j-1] 则可以从下往上,从左往右进行遍历。dp[i][j] 依赖于 dp[i+1][j-1] 则可以从下往上,从左往右进行遍历。回文串记得通过[i,j]中间的来进行判断,相等时不要忘了dp[i+1][j-1]

2024-01-24 22:00:03 437

原创 动态规划Day16(编辑距离,删除元素待写完)

是dp[i][j] = Math.min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2);是dp[i][j] = Math.min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2);若不相同,二选一 dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);因为dp[i][j] 代表0~i-1,0~j-1的最大删除次数,因为dp[i][j] 代表0~i-1,0~j-1的最大删除次数,

2024-01-23 22:01:27 1017

原创 动态规划Day15(子序列第三天,找回状态中。)

t[j-1]时,dp[i][j]要看t[j-2]能组成s[i-1]的最大长度 dp[i][j] = dp[i][j-1]=t[j-1]时,dp[i][j]要看t[j-2]能组成s[i-1]的最大长度 dp[i][j] = dp[i][j-1]因为dp[i][j] 代表0~i-1,0~j-1的最大子序列,则不需要定义dp[i][0],dp[0][j],因为0 代表-1没有意义。2 若不加上s[i-1],也就是s[i-1] 之前的元素也能组成t[j-1] 则为dp[i-1][j]

2024-01-22 21:55:43 789

原创 动态规划Day14(子序列第二天)

因为dp[i][j] 代表0~i-1,0~j-1的最大子序列,则不需要定义dp[i][0],dp[0][j],因为0 代表-1没有意义。因为dp[i][j] 代表0~i-1,0~j-1的最大子序列,则不需要定义dp[i][0],dp[0][j],因为0 代表-1没有意义。dp的定义:dp[i][j] ,nums1 的[0,i-1], nums2的[0,j-1] 的最长公共子序列的长度。= text2[j] 则等于之前的最大值。dp[i][j]记录末尾为i-1和j-1的最长的子序列的长度。

2024-01-20 17:02:11 1039

原创 动态规划Day13(子序列问题)

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。若nums[i-1]=nums[j-1] 则 dp[i][j] = dp[i-1][j-1]+1。dp[0][I]:nums1[0] 与 nums2[i] 相等则dp[0][i]为1其余 为0。

2024-01-19 16:54:16 891

原创 动态规划Day12(股票问题终结,有点疑惑)

打印dp数组时,为什么是Math.max(dp[prices.length][0],dp[prices.length[1]]);则直接为dp[i-1][1],不管是不是冷冻期都默认为dp[i-1][1]打印dp数组时,应该为 Math.max(dp[i][2],dp[i][3],dp[i][4])dp[0][1] = dp[0][0]+prices[0](是有问题的)dp[i][0] 买入股票的最大现金 减去相关的手续费即可。dp[i][1] 卖出股票的最大现金 加上相关的手续付费。1 当天之前是冷冻期。

2024-01-18 16:54:55 1035

原创 动态规划(day11)买卖股票问题进阶

dp[i][1] 第i天or之前买入的最大金额 Math.max(dp[i-1][0]-price[i],dp[i-1][1]);dp[i][2] 第i天or之前卖出的最大金额 Math.max(dp[i-1][1]+price[i],dp[i-1][1]);当天买入Max(dp[i-1][0],dp[i-1][1]-price[i])当天买入Max(dp[i-1][1],dp[i-1][0]+price[i])dp[0][3]:-price[0] 第1天买入再卖出再买入。

2024-01-17 17:51:06 1015

原创 动态规划(day10)买卖股票问题

力扣题目链接(opens new window)给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。示例 1:输入:[7,1,5,3,6,4]输出:5。

2024-01-16 22:22:30 937

原创 动态规划day09(打家劫舍,树形dp)

同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。

2024-01-16 21:43:15 983

原创 动态规划Day08(背包结束,未写完)

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。这是求排列数,判断[i,j] 是否有匹配的字符串,有则为true。使用背包,但是不知道这些字符串要怎么处理比较好。拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。

2024-01-15 22:09:48 539

原创 动态规划Day07

从dp[j]的定义来入手考虑递推公式,比如这道题dp[j]代表可以凑成总金额所需的最少的硬币个数,则递推公式为 ,要么选中当前物品 则为dp[j-coins[i]]+1 ,要么不选,则为dp[j](之前的值)当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。使用0~m ,dp[j] 可以凑成总金额所需的最少的硬币个数。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量。dp[j] 和为j的完全平方数的最小数量。

2024-01-15 22:02:59 1787

原创 动态规划Day06(完全背包)

所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。第i件物品的重量是weight[i],得到的价值是value[i]。我自己写成了 max(dp[j],dp[j-weight[i]]+1) 记混了。

2024-01-15 21:03:50 886

原创 动态规划day05(背包问题)

力扣题目链接(opens new window)题目难度:中等有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。输入:[2,7,4,1,8,1]输出:1。

2024-01-12 16:06:22 1121

原创 动态规划day04(01背包问题)

1 确定dp[i][j]时,若weight[i]>j 则没法取第二种情况,直接取第一种情况dp[i-1][j]1 确定dp[i][j]时,若weight[i]>j 则没法取第二种情况,直接取第一种情况dp[i-1][j]1 若选择物品i 则最大值为 dp[i-1][j-weight[i]]+value[i]1 若选择物品i 则最大值为 dp[j-weight[i]]+value[i]当j>=weight[i] dp[0][j]=weight[i]dp[i][j] 物品0~i之间能填入背包j的最大价值。

2024-01-12 14:37:08 942

原创 动态规划day03

将根节点编号比较好理解 当根节点为第j个节点时,左边为j-1 右边为 i-jdp[j-1]*dp[i-j]//一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j。左子树为3 右子树为n-4 dp[3]*dp[n-4]左子树为2 右子树为n-3 dp[2]*dp[n-3]左子树为1 右子树为n-2 dp[1]*dp[n-2]左子树为0 右子树为n-1 dp[0]*dp[n-1]左子树为n-1 右子树为0 dp[n-1]*dp[0]拆分成近似的数时,得到的乘积是最大的。

2024-01-11 22:41:57 839

原创 动态规划Day02

注意这个for循环的写法 j<obstacleGrid[0].length&&obstacleGrid[0][j]!一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。dp[i][j] 到达i j 位置有多少中不同的路径。dp[i][j] 到达i j 位置有多少中不同的路径。若为障碍物 dp[i][j]则置为0。打印dp[m-1][n-1]打印dp[m-1][n-1]

2024-01-11 22:14:04 929

原创 动态规划day01

理论基础无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了?其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!如果做过动态规划题目的录友,看我的理论基础 就会感同身受了。509. 斐波那契数很简单的动规入门题,但简单题使用来掌握方法论的,还是要有动规五部曲来分析。

2024-01-11 22:00:02 927

原创 贪心算法Day06

从后往前遍历,如果发现str[i]<str[i-1] 则str[i]--,str[i-1]之后的都赋值为9。给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。从后往前,看是否递增,找到字符串中第一个递减的位置,把前一个-1 ,后面的全都变成9。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。说明: N 是在 [0, 10^9] 范围内的一个整数。卡哥做法,使用string来处理数字。

2024-01-11 21:32:40 600 1

原创 贪心算法day05

然后再遍历字符串,同时记录一下当前区间字符对应的最大下标,若当前区间字符对应的最大下标和当前下标相同,代表前面区间的所有字符的最大下标都比当前下标要小,则划分。若不重叠则add,若重叠则把当前list中的最后一个元素右边界修改,再继续往下遍历(右边界不是修改为当前元素的右边界,而是两者中的最大值)字符串 S 由小写字母组成。先排序,使用linkedList,把排序好的存入,遍历看是否重叠,若重叠则移除前一个,从前往后移除。若重叠,则把两者的右区间更新为两个的最小的右区间,看与下面是否重叠,result++

2024-01-04 20:56:39 2173 1

原创 贪心算法day03

1005.K次取反后最大化的数组和本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。以这种方式修改数组后,返回数组可能的最大和。

2024-01-03 17:17:34 1736 1

原创 贪心算法day01

理论基础。。455.分发饼干。

2023-12-30 20:53:44 1183 1

原创 贪心算法Day02

122.买卖股票的最佳时机II本题解法很巧妙,大家可以看题思考一下,在看题解。

2023-12-30 18:46:39 683 1

原创 回溯算法整理day04

93.复原IP地址本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了。

2023-12-28 12:28:59 410 1

原创 回溯算法整理Day01

理论基础其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。1 回溯的本质时穷举,穷举所有可能找出我们的答案2 回溯法能解决的问题3 回溯模板一般用一个path 和result 来收集结果如果是每一次都要处理一个元素 ,则在for循环外操作即可1 回溯函数参数和返回值2 回溯函数的执行逻辑for循环里对本层进行一个处理,然后backTracking3 回溯函数的终止条件。

2023-12-28 11:09:05 936 1

原创 回溯算法整理Day02

不会去重 i>0&&candidate[i]==candidate[i-1]&&used[i-1]==0 时进行continue。不会去重 i>0&&candidate[i]==candidate[i-1]&&used[i-1]==0 时进行continue。注意题目中给我们 集合是有重复元素的,那么求出来的 组合有可能重复,但题目要求不能有重复组合。注意题目中给我们 集合是有重复元素的,那么求出来的 组合有可能重复,但题目要求不能有重复组合。错误的把每个递归都当成了整个数组在递归,没考虑到数组的削减。

2023-12-26 01:16:13 402 1

原创 二叉树进阶

层序遍历看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。

2023-12-14 22:31:22 404 1

原创 二叉树开始了

目录 理论基础 递归遍历 (必须掌握)看到题目的第一想法看到代码随想录之后的想法自己实现过程中遇到的困难迭代遍历 (同上) 统一迭代 (待续)需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义 文章讲解:代码随想录二叉树的三种递归遍历掌握其规律后,其实很简单 题目链接/文章讲解/视频讲解:代码随想录正常的递归遍历能写出来递归三要素确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

2023-12-14 22:12:33 370 1

原创 队列进阶-单调队列和优先级队列

239. 滑动窗口最大值 (一刷至少需要理解思路之前讲的都是栈的应用,这次该是队列的应用了。本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

2023-12-12 17:18:19 1042

原创 栈与队列算法题

20. 有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。

2023-12-09 18:06:29 818

原创 栈与队列开始了

进行size-1次循环,元素每次出队列后,再入队列一次,进行到size次时,就是要取的栈顶元素了,同时数据也再一次入队列。取队列时,从outStack取,看outStack是否为空,若为空,则把inStack的数据全部放入outStack中。判空时和我的方法不一样,比我的简介,直接两个栈判空就行。大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。想到了用两个栈来实现,取队列时把数据从入栈放到出栈里面,取栈顶。建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解。

2023-12-08 21:50:41 416

原创 代码随想录字符串part01

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数。for循环 从前往后遍历,利用数组特性,直接进行值的交换,for循环只走一半。建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。双指针,每次i走一个,j走两个,走k步,然后i之前的进行反转。因为是数组,i可以直接走2K步,然后反转之前的K个。当i+k>length时候就反转剩余的。s[i] 对应s[s.length-i-i]

2023-12-07 22:31:49 448

原创 代码随想录第六天哈希表+双指针(待补充)

建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。

2023-12-05 22:38:48 418

原创 代码随想录第五天哈希表

1 空间复杂度过高,我用了三个数组,代码随想录只用了一个数组,当遍历第一个字符串时,把对应元素的值+1,然后当遍历第二个字符串时,把对应位置的值-1,得出一个最终数组,看最终数组中每个值是否为0。2 关于字符对应数组的下标,我想的时是用每个字符减去对应的ASCII码值来一一对应,太麻烦,我们不需要去记住'a'的ASCII码值,只需要用对应的char-'a' 对应的字符自然而然就是下标了。建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。

2023-12-04 22:30:20 969

原创 代码随想录第四天(链表~)

慢指针走了(X+Y) 快指针走了(Y+Z)n+X+Y = 2(X+Y)==>(X+Y) = n(Y+Z)==>(X+Y)=(n-1)(Y+Z)+Z+Y=>X=(n-1)(Y+Z)+Z==>慢指针走了(X+Y) 快指针走了(Y+Z)n+X+Y = 2(X+Y)==>(X+Y) = n(Y+Z)==>双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。因为快指针是慢指针的两倍速度,当满指针走完一圈时,快指针走了两圈了(快指针一定能追上慢指针)

2023-12-02 21:58:54 920 1

原创 代码随想录第三天(链表开始~新的挑战)

3,while循环中,当该节点删除时,pre指向该节点的后置节点,记住这个时候pre是不需要向后移的和pre=pre.next为if else的关系。2,没有pre 那么得做判断,删除的是该节点的next节点,连接的是该节点的next.next,可以把while循环里的当前节点视为pre节点。2,使用一个pre指向该节点的前置节点,当该节点删除时,pre指向该节点的后置节点,记住这个时候pre是不需要向后移的。2,处理单链表的删除,要记住该节点的上一个节点的位置。的使用技巧,这个对链表题目很重要。

2023-12-01 22:40:51 1039 1

空空如也

空空如也

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

TA关注的人

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