自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录总结篇

态度上:态度大多是端正的,直到遇到了动态规划和回溯的切割字符串的时候感觉学起来就非常的吃力,一度想过摆烂,但是咬牙坚持下来发先对代码的理解程度和函数(哈希表,优先队列等)今后的学习:我一刷大多数题目都是没有考虑时间复杂度的,而且比较离谱的是:面向leetcode编程,随着一刷的结束,我二刷就是了解时间复杂度 先列草稿再做题。感想:学习这么多天的算法题以来解决了许多没见过的算法问题:回溯,贪心,dp动态规划,二叉树等问题。把以前认为完全不可能解决的算法题 有了一个清晰的认识。

2023-09-10 11:22:02 182

原创 day60

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

2023-09-10 11:13:16 149

原创 9.8day59

知识点:单调栈。

2023-09-08 18:10:16 265

原创 9.8day58 单调栈

3.反之 就让该数于栈顶元素进行比较 如果该数大于栈顶元素(while) 就把栈顶元素下表对应的arr数组的值进行相应的赋值 否则就break。2.如果后面要加入的数小于栈顶元素就把数组的下标压进栈里。知识点:1.暴力解决:双for 一个遍历第一个数组 一个遍历第二个数组。

2023-09-08 17:44:13 433

原创 day57 补

力扣题目链接(opens new window)给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:示例 2:提示:输入的字符串长度不会超过 1000 。《代码随想录》算法视频公开课 (opens new window):动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串 (opens new window),相信结合视频在看本篇题解,更有助于大家对本题的理解。两层for循环,遍历

2023-09-08 12:32:57 73

原创 day56补

那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);这里dp数组的定义有点点绕,大家要撸清思路。

2023-09-08 12:31:51 445

原创 day55 补

这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。在之前的题目讲解中,我们讲了1143.最长公共子序列 (opens new window),大家会发现 本题和 1143.最长公共子序列 的相似之处。编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。

2023-09-08 12:30:43 264

原创 day53 补

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

2023-09-08 12:29:16 105

原创 day52(补)

本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);子序列问题是动态规划的一个重要系列,本题算是入门题目,好戏刚刚开始!

2023-09-08 12:28:16 80

原创 day51(补)

这次把冷冻期这道题目,讲的很透彻了,细分为四个状态,其状态转移也十分清晰,建议大家都按照四个状态来分析,如果只划分三个状态确实很容易给自己绕进去。

2023-09-08 12:26:53 39

原创 day50(补)动规做不动了

如果dp[1]取dp[0] - prices[i],今天买入股票,那么dp[2] = max(dp[2], dp[1] + prices[i]);一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?

2023-09-08 12:24:00 39

原创 8.29day49

2.递推公式:1.持有股票 dp[i][0]=Max(dp[i-1][0](上一个状态),-price[i](买入股票))(买亏了就不买入 取最大);2.不持有股票 dp[i][1]=Max(dp[i-1][1],dp[i-1][0]+price[i](加上上一状态的卖出价格就是该状态))3.初始化:dp[0][0]持有所以是-prices[i] dp[0][1] 不持有就是0。知识点:1.dp数组含义 dp[i][0] 表示 持有该i个股票的最大值 dp[i][1] 表示不持有的最大值。

2023-08-30 11:41:58 100

原创 8.28day48(打家劫舍三没做)

2.递推公式:打劫i家:从后往前推 我们如果打劫第i家 那么第i-1家绝对不可能背打劫 所以:dp[i]=dp[i-2]+nums[i]所以我们可以都到递推公式:dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1])如果有两家 dp[1]=Math.max(dp[0],dp[1])不打劫i家:那我们必须打劫dp[i-1]家。3.初始化:如果只有一家 那肯定dp[0]=nums[0];1.dp数组的含义:dp数组表示打劫改房间的最大收益。4.循环公式:从小到大开始遍历 从2开始。

2023-08-28 16:22:28 72

原创 8.26day46(多重背包 背包结束)

相比于01背包:01背包数量是为1 多重背包中数量大于1。解决方法:转换成01背包。

2023-08-27 11:24:33 50

原创 8.25day45

2.递推公式 如果重量为j的背包有dp[j-coins[i]]种方法 那么背包中的元素就应该有 dp[j-coins[i]]+1个元素。3.最大初始化 如果出现 coin=2 amount=3 时输出为-1的特殊情况。3.把要攀爬的楼数看为背包最大容量。2.把能够攀爬的楼梯数看为物品。知识点:1.完全背包问题可以参考 数组总和IV day44。知识点:1.完全背包问题。

2023-08-25 17:37:26 70

原创 8.24day44

2.目标和的种类递推公式 dp[j]+=dp[j-weight[i]]完全背包相对于01背包可以重复加入物品!相对于01背包的完全背包问题!知识点:1.完全背包。所以从小到大开始遍历。

2023-08-24 20:33:05 79

原创 8.23day43

2.递推公式 背包容量为j的排列种类为 dp[j]+=dp[j-nums[i]];比如说 1 1 1 1 1 确定 四个1的位置 那么 -1的位置也能找出。算出一份质量相同石头(背包最大能放的质量)的实际最大值(能放入的最大石头)(因为石头是个体可能会超出范围)因为我们要找出最大种类 所以就可以以四个正一为背包大小来获得背包问题。正数集合+负数集合=sum(数组内数的总和)两个石头相撞 求撞完后的最小石头 可以先堆出两份质量相同的石头。正数集合-负数集合=target。知识点:1.背包问题01。

2023-08-23 16:25:07 60

原创 8.22day42(动态规划的背包问题)

wok 没学过真的很难。自己没怎么总结出一二。

2023-08-22 18:13:58 63

原创 8.21day41

2.递推公式:我们要让dp中的值一直递推 dp[i]=j*dp[i-j] 可以一直让dp递推如6=2*(4)->2*2*(2)3.dp初始化 因为0,1拆分的最大乘积是 0 2的最大乘积是1。4.确定遍历顺序:先遍历外圈再对内圈进行循环。知识点:1.dp数组含义:表示该值的最大乘积。

2023-08-21 16:48:47 41

原创 8.19day39

2.递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];如果上一个点由几条路劲经过 下一条路径也应包含该路径(如果经过)的条数。1.dp数组含义:i表示从 0.0 出发到 i.j有dp[i][j]条不同的路径。3.初始化:因为第一行和第一列只可能由一条路径经过所以初始化唯一。2.如果第一行第一列出现障碍物 接下来第一列后的路径值都为0。4.遍历顺序:从左往右 从上往下。3.出现障碍物就把dp中的值变为0。知识点:现对于上一个题就是多了一个障碍物处理。

2023-08-19 14:31:45 36

原创 8.18day38动态规划(包括介绍)

我的理解:因为在到达目的值之前 我们可以记录上一个值的大小 再递归进下一步时可以用上一步得到的值从而能够更快的找到目的值(抽象)知识点:动态规划 已知公式dp[n]=dp[n-1]+dp[n-2] 初始化dp[0]=1,dp[1]=0;因为一开始他就可以从1 ,2台阶走 所以dp[0] dp[1]为0。知识点:1.怎么找最小?因为dp数组每走一步要花费记录的上一步骤走的花费数 所以我们找出上两步的最小值。知识点:爬到最后一阶时 可以由上一阶或二阶攀爬 所以爬上最后一阶可以为上一阶和二阶之和。

2023-08-18 16:19:10 33

原创 8.17day37贪心结束

知识点:1.贪心算法:如果后面的数比前面的数小 就把前面的数减一 然后面一位数变成9。

2023-08-17 14:27:36 70

原创 8.16day36

2.用一个临时变量temp 求temp与hash表中值的最大值。2.如果有发现区间重合 我们就把区间合并(取并集)再放入栈中。2.如果不小于 就count++ 算出不重复数量。知识点:1.如果 下一个边界小于前面一个 就把边界更新:能穿过更多的气球 球。知识点:1.用hash表遍历一遍字符串 //把走到的最大值付给该字符。3.如果已经遍历到了最大值 就分割。3.减去不重复的区间 就是重复的。3.没有就直接放入栈中。跟之前的最少的箭穿过最多的气球一样。知识点:1.建立数组栈 deque。

2023-08-16 16:08:00 35

原创 8.15day33

知识点:1.通过lamba排序 如果身高相同就以k的升序排列 反之就用身高的降序排列。2.判断是否可以一箭穿多个球 (else下边自增比较妙)2.以k为index对数组进行排序。知识点:1.贪心:只要有十块钱零钱 就把十块钱花出去。知识点:1.按照左边范围排序 要防止溢出。问题:一刷思路不清晰。

2023-08-15 16:37:56 39

原创 8.14day34

2.局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。cost 和 gas之间的值中差的总和小于0 该出发点只能再出现负数位置的后一位。知识点:1.让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。知识点:cost 和 gas之间的差数组 值的总和小于0 过不了。知识点:贪心 比较复杂可以看一下视频 了解原理(问题:暴力超时,思路不清晰。

2023-08-14 13:13:40 23

原创 8.12day32

知识点:贪心(遍历所有的值 发现能够覆盖整个数组长度的值就返回 达到现有覆盖边界 就让最大覆盖边界替换现有覆盖边界 再让步数加一 就是走进这个步数)2.用for循环遍历去吸收数组总和(nums[i]-nums[i-1])2.for循环遍历覆盖范围内数组的值。我的问题:暴力解决没有发现可以在for中把result自增。知识点:1.贪心算法(选择最大的值之和 )知识点:1.贪心算法(学会最大覆盖范围)

2023-08-12 15:21:08 56

原创 8.11day31(贪心)

情况一:上下坡有平坡 122221 2222就是平坡(但是我们要计下最后一个2的数) 所以当左边的值小于等于0 右边的值大于0 或者左边的值大于等于0 右边的值小于等于0。解题思路:通过遍历饼干的数量再让饼干和人的胃口比较大小,如果饼干大于人的胃口 就让饼干减少 人的胃口数组也减少 计数++反之 人的胃口数组减少。知识点:贪心算法:如果累加值小于等于零 那么后面累加数是无效的 我们可以重新给累加数赋初值 再进行累加。情况二:当数组中只有两个数时要计数 我们可以先把pre赋值为0。2.for循环遍历数组。

2023-08-11 13:16:36 22

原创 8.10day30回溯算法的总结

/可能要求对每一程进行去重if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false)//used是数子是否被使用的数组。bianli(i+1/i(i+1是进入下一个数往后面遍历,i是包括可以遍历自身),......);void bianli(int index(递归值)....等参数列表)//一般列表内需要什么加什么。if(递归终止条件 (比如说数已经够放入集合中了或者值已经相等了))for(int i=0/index;知识点:1.回溯遍历棋盘。

2023-08-10 13:06:23 26

原创 8.9day29

要求:不含有重复元素的子集 如 7678 767不是子集 因为用了重复元素7。2.通过回溯法把每一个数都加入List中。知识点:1.使用used boolean数组 判断是否使用过。做题漏洞:没看明白要求 不知道要用set去除重复元素。3.使用回溯上一元素。知识点:1.用hashset对重复元素进行标记。

2023-08-09 15:08:21 55

原创 8.8day28

一开始 我们先取 2 ->字段有效 ->2.5525511135->把分割线给到5->字段有效->2.5.525511135->字段有效->2.5.5.25511135->末尾字段无效->回溯到上一点的位置再进行自增->2.5.5.25.511135->...... 依次遍历所有ip地址 如果ip地址有效就写入 List中。3.StringBuilder 对字符串中的字符“ . ”插入点的位置 和函数 insert ,deleteCharAt的使用。学会排序加上上面的遍历这一题就非常简单了。

2023-08-08 13:41:21 34

原创 8.7day27(组合遍历|| 40题不熟)

如果前面一个数和后面一个数相同 那么我们就往下走 (为什么?因为相同的数字做为枝干对下面所有的数字遍历结果都相同)特别的!used[i-1] 当前面一个数在层树中必须被使用过(保留一个结果)才行。重复遍历的时候 如果大于该数直接return 跳过循环。特别是树层的去重 和树枝去重比较抽象。在传递值的时候通过实现一直传第一个。脑子不太够用了 明天要再多看看。比较难 cpu快给我干烧了。总结了一下:大概就是这一句。举例:12225 如果没有。在总和上也减少相应值。

2023-08-07 17:48:01 37

原创 8.5day25

这一题没有想到 在for循环外面可以加新字符串 从而达到 让第一个字符串里的字符 与 第二个字符串字符配对的目的。心得:以后做回溯题一定先流程图。相比于上一个组合就比较简单了。只用考虑想等的情况就行。

2023-08-05 10:08:18 55

原创 8.4day24(回溯)

满足队列或者栈中的最大数就把数组放进去。把每一个数装入容器内(队列或者是栈)初学回溯算法 感觉还是不太会。

2023-08-04 16:38:04 28

原创 8.3day23

随想录里面并没有要求返回搜索树所以不用考虑左右结点都不为空的情况。我就用了一下深度搜索(后序遍历)完美解决删除头结点的问题。一开始我用前序遍历发现解决不了删除头结点的问题。这道题看似比较简单其实还是难的。修剪二叉树跟删除结点非常类似。考了二分查找去建立二叉树。比较简单 右左中遍历。

2023-08-03 17:22:06 23

原创 8.2day22

会做 数的最近祖先这个题就比较简单。比较简单 因为它不对返回树做要求。这种算法题还是要记住性质多练。

2023-08-02 17:36:36 61

原创 8.1day21(236公共祖先的算法要多学)

通过中序遍历来查找二叉搜索树的众数。昨天莫名其妙多写了一个题哈哈哈。其中这几句最妙可以我们解决问题。如果出现更高频的词 就全部清除。用上一指针处理就比较简单。即如果没有众数按原数输出。

2023-08-01 16:36:51 135 1

原创 7.31day20(有感悟)

中序遍历 首先判断左边是否含有结点 再判断中间的值是否大于该结点值如果不大于整体顺序不对返回false 再判断右边是否含有节点 如果遍历完所有节点都没问题就返回true。心得:解决二叉树的要领:首先判断参数和返回值 其次循环的终止条件 最后满足题目的算法和递归语句 特别的:递归语句可以先拿出子树进行局部判断再从局部解决个例再到整体。要先了解二叉搜索树的概念:比头结点小的值放入结点左边 比节点大的值放入节点右边。学了双指针建一个指向前面一个结点的指针就感觉非常巧妙。如果查到有该节点的子树就返回该结点。

2023-07-31 17:07:16 35 1

原创 7.29day18

注意的是如过不加入全局变量,而只是把变量放入函数中循环,会导致flag一直重复被赋值。因为要最左边的结点所以只要遍历叶子结点 判断深度是否大于改点的深度就可以了。这一题比较复杂感觉还是没弄太清楚 周日还得多练一下 主要是他的数学算法逻辑。没想到是最左边的结点 一顿卡卡写结果报错 知道这个过不起才知道是最左边。2.在同一层的结点因为按照前序遍历的原则不会遍历右结点。一开始以为题目是要我求最底层左子树的左节点。1.可以遍历每一个叶子结点。也是用回溯规范的三步法解决。

2023-07-29 16:41:16 60

原创 7.28day17(平衡二叉树 深度与高度的学习非常重要)

我的理解是:因为要遍历每一条到叶子结点的路径并复用叶子结点的上一结点 ,我们需要把叶子结点值pop掉 回溯到上一枝干结点。当该节点左子结点不为空且左子树的左结点不为空且左子树的右结点不为空是才满足左叶子结点。因为左子树和右子树会产生叶子结点所以 用left right去存左边和右边的数。我同时学到了 list可以用get(i)来访问里面的数 之前都是用加强for。如果出现了左子树于又子树的绝对值大于1了又返回-1。明确递归函数的参数和返回值。

2023-07-28 17:21:42 28 1

原创 7.27day16

右边为空 左边不为空则返回左边的值(让右边的值等于左边值加一再取最小)所以如果出现:左边为空 右边不为空则返回右边的值(让左边的值等于右边值加一再取最小)用层序遍历 遍历每一层 直到遍历到最底层(每一层数量增加)依照三大方法:循环条件 返回值类型 循环语句。通过层序遍历只要遍历到叶子结点就返回。跟最大深度差不多但是要明白最小深度的意思。

2023-07-27 12:37:33 46 1

空空如也

空空如也

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

TA关注的人

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