![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法python
文章平均质量分 71
用python备战秋招
Estrellazhu
这个作者很懒,什么都没留下…
展开
-
Day60代码随想录单调栈part03:84.柱状图中最大的矩形
如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。题意:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。元素从栈顶到栈底是单调递增的求的是比他大的元素,反之求的是比他小的元素。原创 2024-05-21 13:08:55 · 409 阅读 · 0 评论 -
Day59代码随想录单调栈part02:503.下一个更大元素II、42. 接雨水
题目:给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。题意:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。,最后再把结果集即result数组resize到原数组大小就可以了。单调栈解法:接雨水这道题目,我们正需要寻找一个元素,原创 2024-05-20 11:14:45 · 229 阅读 · 0 评论 -
Day57代码随想录单调栈part01:739. 每日温度、496.下一个更大元素 I
输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。原创 2024-05-18 21:24:45 · 527 阅读 · 0 评论 -
Day55代码随想录动态规划part16:583. 两个字符串的删除操作、72. 编辑距离
那最后当然是取最小值,所以当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);,情况虽说复杂一些,但整体思路是不变的。原创 2024-05-16 20:33:34 · 868 阅读 · 0 评论 -
Day53代码随想录动态规划part14:1143.最长公共子序列、1035.不相交的线、53. 最大子序和动态规划
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。**区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。原创 2024-05-14 13:29:09 · 811 阅读 · 0 评论 -
Day52代码随想录动态规划part13:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
题意:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。题意:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。思路:只用和i-1比较了,都不用有循环了。题意:相比于上一题,这题是连续的。原创 2024-05-13 21:40:46 · 344 阅读 · 0 评论 -
Day50代码随想录动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
题意:给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。题意:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格。设计一个算法计算出最大利润。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。原创 2024-05-12 11:11:05 · 304 阅读 · 0 评论 -
Day45代码随想录动态规划part07:70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数、139.单词拆分
这道题出现的问题:(1)首先dp[0]的初始化还应该是1,因为dp[0]是后序累加的基础;(2)递推公式没有想清楚,这里是dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j],所以是累加的关系。你可以认为每种硬币的数量是无限的。题意:假设你正在爬楼梯。题意:给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。:题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。原创 2024-05-06 18:53:36 · 513 阅读 · 0 评论 -
Day3代码随想录动态规划part01:动态规划原理、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。**举例:**背包问题:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。**DP定义:**如果某一问题有很多重叠子问题,使用动态规划是最有效的。:第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来—第二层楼梯爬一步+第一层楼梯爬2步。,贪心没有状态推导,而是从局部直接选最优的。原创 2024-04-26 20:40:59 · 822 阅读 · 0 评论 -
Day36代码随想录贪心part05:435. 无重叠区间、763.划分字母区间、56. 合并区间
题意:字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。补充:其实下列代码还是应该考虑intervals为空的情况的。**思路:**在遍历的过程中相当于是要找每一个字母的边界,一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。思路:还是基本和之前 435. 无重叠区间 相似的思路。此时前面出现过所有字母,最远也就到这个边界了。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。原创 2024-04-24 14:25:52 · 345 阅读 · 0 评论 -
Day34代码随想录贪心part03:1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
*题意:**在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。:给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。**(1) 对列表排序:**假设你有一个包含元组的列表,每个元组包含名字和年龄,你想根据年龄对这个列表进行排序。**(2)查找最大值:**在同样的列表中,找到年龄最大的人。原创 2024-04-22 11:24:45 · 853 阅读 · 0 评论 -
Day17代码随想录二叉树part04:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。,如果检查过程中就发现了高度差大于1的情况直接返回-1,题意:给定一个二叉树,返回所有从根节点到叶子节点的路径。:因为由父节点指向子节点生成一条路径。原创 2024-04-05 16:20:43 · 327 阅读 · 1 评论 -
Day1代码随想录-704. 二分查找、27. 移除元素
快指针所指向的是新数组里需要的元素,只有在不等于目标值的时候快指针才有意义。慢指针是在等于目标值的时候有意义。在物理空间上是一个覆盖的操作,是一个O(n)的时间复杂度,而不是O(1):重点是保证这个要查找的区间是个合法区间,考虑特殊情况比如。**的元素,并返回移除后数组的新长度。**难点:**区间划分。,[1,1)(不合法)原创 2024-03-20 20:32:14 · 189 阅读 · 0 评论 -
Day6代码随想录哈希表part01-242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
哈希表的三种数据结构:数组、set和mapdefaultdict和counter也可以作为思路,下去可以再研究一下考虑用到哈希表的情况:一个元素是否在数组中出现过C++中本题可能更倾向于用set:unordered set思路:先遍历nums1记录出现的元素,然后在nums2验证是否出现过之前在学习python的时候,在获取值得时候常用的方法就是直接print(dict[key]),但这种方法中当字典中不存在该键时会返回KeyError类型错误,此时就可以用get()函数还利用键获取值。原创 2024-03-25 20:51:26 · 152 阅读 · 0 评论 -
Day4代码随想录:24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、142.环形链表II、160. 链表相交
m是链表长度,fast移动之后链表剩余(m-n)个需要移动,所以慢指针移动了(m-n)个,因此慢指针停在从后往前数m-(m-n) = n位。**思路:**分快慢指针,fast指针先移动n步,然后两个指针同时移动,直到最后一个节点,这样slow就到倒数第n位。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。具体思路就是三个位置的交换,要注意保存中间变量,可以手动画图。原创 2024-03-23 16:28:09 · 341 阅读 · 0 评论 -
Day11代码随想录栈与队列基础part02-20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值(理解难)
计算机往往使用后缀表达式,比如(1+2)×(3+4)在后续里有12+34+×,计算方式是遇见数字就加入栈中,遇见运算符就把数字取出进行计算。题意:有效的运算符包括 + , - , * , /。每个运算对象可以是整数,也可以是另一个逆波兰表达式。方法二:使用双指针模拟栈,这样可以指向前一个元素。有用eval的简单写法可以学习。先来分析一下 这里有。原创 2024-03-31 18:12:22 · 136 阅读 · 1 评论 -
Day3代码随想录-203.移除链表元素、707.设计链表(运用了链表的所有操作)、206.反转链表
好处:直接易于理解;坏处:需要分为头节点和非头节点单独操作虚拟头节点的删除方式:(伪代码)好处:不用对头节点单独操作;需要注意返回值。原创 2024-03-22 22:30:54 · 103 阅读 · 1 评论 -
Day14代码随想录-二叉树的递归遍历和非递归遍历
至于如何reverse除了用库函数,也可以想到数组交换。原创 2024-04-02 23:20:35 · 262 阅读 · 1 评论 -
Day2代码随想录-977.有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵II
*思想:(1)**左闭右开的区间,要统一每条边移动的处理方式,比如这里都不算最后一个点;(2)需要循环的圈数为n/2,如果是奇数边要单独处理中间的值:为什么是n/2呢?循环的j是终止位置,先在i不动的情况下移动j++直到窗口内数的总和大于target(扩),然后移动i++在保持大于target的情况下进一步缩短窗口长度(缩);:这是一个有序数组,虽然其中有负数,但是平方后的最大元素出现在数组的两端不可能是中间,例如[-4, -1, 0, 1, 4, 5]→[16,1,0,16,25]所以考虑到。原创 2024-03-21 13:31:17 · 178 阅读 · 0 评论 -
Day10代码随想录栈与队列基础part01-232.用栈实现队列、225. 用队列实现栈
(3)对于列表list的pop:默认值是pop(-1)也就是删除最后一个元素,所以append是能把他再返回来的!但是也可以写pop(0)相当于队列的操作。(1)pop操作:这个过程是如果stackout里面有值,说明队列先进先出的还在里面;如果stackout没有值了,那就重新出栈转移这个过程。(2)peek查看队列顶部操作:注意pop出来的元素要返回的是stack_out!思路:其实这道题目就是用一个队列就够了。**思路:**一个in栈,一个out栈。原创 2024-03-29 23:02:31 · 282 阅读 · 1 评论 -
Day9代码随想录字符串part02-28. 实现 strStr()、459.重复的子字符串
next数组的最后一个地方就是最长相等前后缀也就是next[len(s)-1],所以如果字符串长度len(s) - next[len(s)-1]得到的最小不重复子串能被总长度len(s)整除,就能证明是最小重复单元。**什么是前缀:**所有包含首字母但不含尾字母的所有子串,都称为前缀:a, aa, aab, aaba, aabaa都是前缀。**什么是后缀:**所有包含尾字母但不含首字母的所有子串,都称为后缀:f, af, aaf, baaf, abaaf都是后缀。:例如,字符串a的最长相等前后缀为0。原创 2024-03-28 23:41:31 · 576 阅读 · 1 评论 -
Day7代码随想录哈希表part02-454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和
本题的思路相对而言比较简单,首先先存储ab的和出现的频率,再统计cd的和有没有符合sum(a,b)+sum(c,d) =0,最终得到结果一些同学可能想,用数组干啥,都用map完事了,原创 2024-03-27 00:01:28 · 200 阅读 · 0 评论 -
Day13代码随想录栈与队列基础part03-239. 滑动窗口最大值、347.前 K 个高频元素
有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。其实,大家可以自己观察一下单调队列的实现,nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 O(n)。大顶堆和小顶堆的区别:大顶堆是顶上元素大,子节点元素小,先pop大的元素;**思路:**希望构造一种单调队列,这个队列中元素是排序的,且最大值在顶部,同时我们可以随着滑动窗口修改其中的元素。即push(-元素),pop(-元素)原创 2024-04-01 22:50:17 · 335 阅读 · 0 评论 -
Day8代码随想录字符串part01-344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
这样做前k个的字符反转,如果用while计数过于麻烦了,所以用for循环,for i in range(0, len(s), 2。,这实际上会生成类似于 "['a', 'b', 'c']" 的字符串,而不是你想要的 "abc"。想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。**思路:**通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,,这意味着每个元素都被包括,所以在这种情况下,[::]原创 2024-03-27 21:13:01 · 689 阅读 · 0 评论