leetcode(c++)
文章平均质量分 50
绿风天空
这个作者很懒,什么都没留下…
展开
-
数学类问题(Leetcode)
所以 m = log3(n) = log10(n) / log10(3),对m取余数来判断m是不是整数,m是整数,则说明n是3的幂。所以要计算5因子的数量,就是用n/5来计算5的倍数,再用n/25来计算25的倍数,一直计算,直到n/(5^x)为0。,可以知道1-100这100个数中每五个数,就有一个5的倍数,每二十五个数中,就有一个25的倍数。遍历大于1 且小于n的每个数的倍数,设置为非质数,剩下的就都是质数了。另一个解法是:如果n是3的幂,那么存在一个整数m,使得m^3 = n。3.阶乘的0 的个数。原创 2023-08-08 17:46:42 · 106 阅读 · 0 评论 -
分治法 Divide and Conquer
分治法(Divide and Conquer)是一种常见的算法设计思想,它将一个大问题分解成若干个子问题,递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。分治法的主要思想是将问题分解成若干个相互独立的子问题,通过递归地解决每个子问题,最后将子问题的解合并起来得到整个问题的解。这种思想可以应用于许多问题的解法中,如排序、搜索、图论、数学计算等等。所有我们可以用分治法,将问题从大到小拆解,先满足每个长度为1、2、3......的数组都是漂亮数组,这样最后长度为n的数组也是漂亮数组。原创 2023-07-31 20:57:58 · 188 阅读 · 0 评论 -
动态规划(八) 练习题
还有另一个写法dp[i]=max(dp[i],dp[j]*dp[i-j]),我感觉这可以算是第三种情况,就是j和(i-j)都取拆分。dp[i][j]表示数组[0...i]的组合和为j,所以等于数组组[0...i-1]的组合和为j-nums[i],加上数组组[0...i-1]的组合和为j+nums[i]的和。这时候,直觉地会有一个写法dp[i]=max(dp[i],dp[j]*(i-j)),这其实是和第二种情况重复了,i和i-j本质上是等价的。接下来再处理,就不会出现差值为零的情况了,只会大于0或者小于0。原创 2023-07-21 22:47:22 · 41 阅读 · 0 评论 -
动态规划DP(七) 股票交易
代入 sell[i][j],得到 sell[i][j] = max(sell[i-1][j], buy[i-1][j-1]+prices[i],sell[i-1][j-1] -prices[i]+prices[i])比原本的 sell[i][j]多出了这一项:sell[i-1][j-1] -prices[i]+prices[i]所以buy[i][j] = max(buy[i-1][j], sell[i-1][j]-prices[i])就变成了 sell[i][j] = max(sell[i-1][j],原创 2023-07-12 16:30:55 · 116 阅读 · 0 评论 -
动态规划 DP (六) 字符串编辑
也可以在word1[i]后增加一个新字符word2[j],这样最后面的两个字符就相等了,但需要word1[0...i]与word2[0...j-1]是相等的,所以就是dp[i][j-1]加一。也可以删除掉word1[i],这样就需要word1[0...i-1]与word2[0...j]是相等的,所以就是dp[i-1][j]加一。dp[i][j] = dp[i-1][j-1] 如果s[i-1]与p[j-1]匹配成功 否则为false。基于这个假设,我设想的很复杂的c****,也是不合法的输入。原创 2023-07-08 22:38:20 · 319 阅读 · 0 评论 -
动态规划 DP (五) 背包问题
dp[i][j] = dp[i-1][j] || dp[i][j-nums[i]] 当j>nums[i]时,表示此时可以取nums[i],也可以不取nums[i],需要把这两种情况都考虑了,若有任何一种情况可以满足和为j,那么dp[i][j]就为true。这道题和上一题的最大区别就是多了一个背包,所以压缩前的算法就是多了一个维度,变成三维数组dp[i][j][k],第一维代表在[0,i]里来选择元素,第二个维度代表上限为j个零,第三个维度代表上限为k个零。目标是选择物品放入背包,使得总价值最大化。原创 2023-07-07 13:35:20 · 292 阅读 · 0 评论 -
动态规划 DP (四) 子序列问题
解题思路:两重遍历所有可能的字符串匹配结果,如果末尾元素相等,则为去掉末尾元素时的最长长度加1,否则是一个字符串保留末尾元素,另一个字符串去掉末尾元素的两种情况的最长长度中的最大值。解题思路:因为子序列,其实就意味着要进行两层遍历了,分别列举子序列的结尾坐标和开始坐标,这样才能遍历完所有子序列。然后遍历的时候,记录当前元素结尾的最长子序列长度。当当前子序列的开始元素大于前一个元素时,以为着存在一个更长的子序列,与现有长度进行比较,选择更长的子序列。原创 2023-07-02 17:23:16 · 122 阅读 · 0 评论 -
动态规划 DP (三)
这道题比较清晰,每当子串与字典中的词相等时,当前的状态就会等于字符串中减掉字串的坐标的状态。如果结合起来是一个11到26之间的数字 ,那说明当前元素有两种解码方法,一种是与前一个元素结合,一种是独立成为一个数字。如果结合起来是一个不在10到26之间的数字,那说明当前元素只有一种解码方法,就是独立成为一个数字。如果结合起来是10,那说明当前元素只有一种解码方法,就是与前一个元素结合,因为0不能独立存在。当前元素的解码方法,取决于当前元素和前一个元素。,选择最少的那个,然后加一,就是8的。原创 2023-06-26 20:45:00 · 234 阅读 · 0 评论 -
动态规划 DP (二)
若想要正方形变成为2,那么不仅要当前元素值为’1‘,还需要上边,左边,左上角三个元素分别所能构成的最大正方形边长>=1。若想要正方形变成为3,那么不仅要当前元素值为’1‘,还需要上边,左边,左上角三个元素分别所能构成的最大正方形边长>=2。很直观地能发现,先从左上往右下扫描,得到只考虑左边元素和上边元素时的最小距离。第一行的的路径只与左边的元素有关,第一列的路径只与上面的元素有关。除了第一行和第一列,其他元素的路径取决于左边和上面元素的最小值。当元素值为1时,最近距离为周围四个元素的最近距离的最小值加1。原创 2023-06-23 21:20:28 · 365 阅读 · 0 评论 -
动态规划 DP (一)
dp[i] = dp[i-1] + 1 当(nums[i]-nums[i-1]) == (nums[i-1]-nums[i-2])时。所以当遍历到一个元素满足(nums[i]-nums[i-1]) == (nums[i-1]-nums[i-2])这个条件时,所以转移方程为: dp[i] = max(dp[i-2]+nums[i], dp[i-1])[ nums[i-2], nums[i-1], nums[i] ]构成一个新的等差数列,一个是[2,3,4],另一个是前一个等差数列的延续[1,2,3,4]。原创 2023-06-22 17:08:21 · 631 阅读 · 0 评论 -
搜索算法(五) DFS BFS 练习题
所以每次都删除掉最外围的叶子节点(也就是入度为1的节点),删掉叶子节点之后,与它们相连的入度为2的节点就会变成新的叶子节点,这样新一轮继续删除叶子节点,更新与它们相连的节点的度数。先预处理矩阵,然后DFS,需要注意的是DFS的递归方法中,最后找到目标解法后,要在每一层递归直接return,不然会继续遍历可能的数字。这里有些类似层次遍历,每一次删除最外层节点,当删除到只剩下两个或一个节点时,可以认为它们是最中间的节点,作为答案返回。看上图还是挺生动形象的,从相距最远的节点,一层一层剥开,最后找到中心节点。原创 2023-06-19 20:52:00 · 360 阅读 · 0 评论 -
搜索算法(四) 广度优先搜素算法
这道题实际是计算两个岛屿之间的最短距离,可以先用dfs搜索到第一个岛屿并且记录第一个岛屿的每对坐标,接着以这些坐标作为bfs的起始节点集合,一层一层地向外遍历,寻找第二个岛屿,当找到第二个岛屿时,当前遍历的层数减一就是两个岛屿之间的最短路径。DFS从目标单词开始搜索,反转最终路径。用BFS从起始单词开始,变换一个字母,代表走了一步,变换两个字母,代表走了两步了,一层一层变换,一直遍历到达目标单词。在一层一层遍历的过程中,需要记录下每一层变换所得到的单词,这样BFS结束后,可以用DFS找到最短路径。原创 2023-06-05 15:11:06 · 525 阅读 · 0 评论 -
搜索算法(三) 回溯法
N皇后是经典的回溯问题,一行一行地放置皇后,每次放置前,判断一下是否符合每列每斜线只有有一个皇后的约束。放置皇后后,继续深搜下一行可能的放置方式,搜索完毕后,取消放置该行皇后。修改和还原当前节点放在了dfs函数的开头和结尾,中间遍历未访问的节点,递归访问这些节点。回溯法可以理解成一种特殊的深度优先算法,比起普通的DFS,多了还原当前节点的一步。这题与上一题类似,只是停止搜索的条件变为组合长度为k。这题也是一样的回溯结构,深搜符合条件的路径。修改当前节点、递归子节点、还原当前节点。本质是一种试错的思想。原创 2023-06-04 15:13:19 · 548 阅读 · 0 评论 -
搜索算法(二) 深度优先搜索 dfs
利用深度优先搜索算法,依次遍历每个未访问的城市,若该城市与其他未访问城市A相连,则继续向下访问城市A,若城市A与未访问城市B相连,则访问城市B,若城市B……这题与前一篇博客中计算岛屿面积类似,只是换成了计算省份数量,以及搜索范围扩大到所有城市了。所以可以反向思考,从四条边出发进行深搜,判断是否满足大于等于的条件。这道题如果对每个坐标进行深度优先搜索,就会十分复杂,O(N^2)原创 2023-05-26 15:52:06 · 36 阅读 · 0 评论 -
搜索算法(一) 深度优先搜索 dfs
当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。简单来说,就是沿着起始节点一直向节点的子节点,子节点的子节点……一直向最深处(叶子节点)搜索,若搜索到最深处(下一个节点为空),还未找到目标,则返回上一级节点,寻找该节点的另一个子节点,再继续这个过程。辅函数负责深度优先搜索的递归调用(遍历上下左右四个节点,若四个节点为岛屿且未被访问,则继续递归调用辅函数)实现方法:栈或者递归。原创 2023-04-12 10:49:15 · 424 阅读 · 0 评论 -
排序算法(二)
解题思路:用三个指针,两个分别指向有序的0,2区间,另一个遍历整个数组,遇到0,与指向0区间的指针交换值,遇到2,与指向2区间的指针交换。这道题就是非常典型的桶排序,先将每个元素分配到桶(统计每个元素的出现频次),再根据频次排序每个桶。这道题也是桶排序,可以用和上一道题一样的方法排序,也可以在第二次排序时以递归方式继续使用桶排序。桶排序会进行两次排序,一次将所有元素分配到不同的桶中,一次针对每个桶排序或再次排序所有元素。需要注意的细节是遍历指针与2区间指针交换后,指向的值可能为0,所有不能直接自增。原创 2023-04-11 10:13:04 · 599 阅读 · 0 评论 -
排序算法(一)
快速选择就是快速排序的第一步,将某个元素放到正确的位置上,左边的元素都小于它,右边的元素都大于它。快速排序接下来会继续迭代处理左右区间,而在快速选择中,则判断该元素是不是目标元素,再根据二者大小,选择左右区间。这题还是需要注意很多细节,很容易写错,譬如quickSelect()中两个指针i,j移动时,限定条件不是i原创 2023-04-10 12:07:51 · 418 阅读 · 0 评论 -
二分查找(三)
针对有序数组二分查找,有很多变形题,基本思路就是分情况讨论,这道题需要考虑选择[left, mid)区间还是(mid,right]区间,拿几个例子分析一下,可以发现这取决于mid元素是否与前一个元素相等,以及左右两个区间的元素数量。注意点:k表示第k个数,从1开始计数,我一开始的写法是从0开始计数,导致当k=1时,k=k-k/2这一步一直停留在1,无法继续迭代。最简单的方法就是把数组里所有数一次异或,最后得到的结果就是单一元素,因为任何一个数a, a^a = 0, a^0=a.原创 2023-04-09 17:11:53 · 55 阅读 · 0 评论 -
二分查找(二)
这题需要分三种情况,第一种是区间有序,正常二分查找,第二种是区间 被旋转,左区间的值大于右区间,需要比较目标值和左区间起始值的大小,来判断选择哪一个区间,第三种是无法区分左区间大还是右区间大,此时[left]==[right],可以直接进行left++或者right--来跳过该值。这题与上一道题类似,也是分析旋转数组可能的情况,找出目标值。原创 2023-04-06 17:29:47 · 492 阅读 · 0 评论 -
二分查找(一)
二分查找一般用于有序的序列,将序列一分为二,通过比较中间值与目标值,舍弃一半的区间,只在剩下的一半区间内继续查找,时间复杂度为O(logn)。如果做这类题目,觉得模板种的1,3,4很混乱,不知道该怎么取,那可以先直接写一版,case报错了,再依次调整1,3,4处。找左边界的时候,需注意当中间值与目标值相等时,应该选择左边区间,因为要找的是左边界,肯定是在中间值左边(或者就是中间值)找右边界的时候,需注意当中间值与目标值相等时,应该选择右边区间,因为要找的是右边界,肯定是在中间值右边(或者就是中间值)原创 2023-03-30 11:09:18 · 180 阅读 · 0 评论 -
双指针(二)
接着在字符串s中从头开始移动右指针,每当滑动窗口中包含了字符串t的全部字符,就开始移动左指针,缩小滑动窗口范围。当然这可能会导致滑动窗口无法包含字符串t的全部字符,所以继续移动右指针,直至满足条件。题目中要找满足包含满足条件的最小子串,所以可以用左右两个指针,右指针保证满足条件(包含字符串t的全部字符),左指针保证是最小子串。每次滑动窗口包含字符串t的全部字符都记录下最小长度,当右指针遍历完成时,就可以获得满足条件的最小子串。中,写到了同方向双指针快慢指针的用法,这一篇写另一个用法:滑动窗口。原创 2023-03-29 14:01:10 · 306 阅读 · 0 评论 -
双指针常用方法
所以【快慢指针相遇的节点--环的入口--快慢指针相遇的节点】== 【 起点--环的入口--快慢指针相遇的节点】下图使用快慢指针,从起点[3]出发,慢指针一次一步,快指针一次两步,很快这两个指针会在节点[-4]相遇。相遇后,将慢指针移回链表起点[3],快慢指针都一次走一步,两个指针再次相遇的节点[2],就是环的入口。所以找到环得到入口就是将慢指针移到起点,与快指针都是一次一步,直到相遇,相遇节点就是环的入口。快指针路径:起点--环的入口--快慢指针相遇的节点--环的入口--快慢指针相遇的节点。原创 2023-03-28 10:28:16 · 409 阅读 · 0 评论 -
贪心算法(四)
贪心算法的运用在于,既然发现了局部的递减,那就立刻进行修改,因为只能修改一次,所以修改完再判断整个数列是否完全非递减,若满足则成功,若不满足则表示数列不符合题目要求。这道题运用贪心算法,就是每天只考虑与前一天的差价,只要差价大于零,从局部最优来考虑,就应该卖出前一天的股票。这样可以得到全局最优解。这道题 的第二个属性指的是有多少比自己高,所以可以按照身高有高到底来重建队列。处理当前元素时,插入的位置就是第二个属性的值,因为之前插入的人都比自己高。另外,身高相同时,第二个元素值小的人,先进行插入。原创 2023-03-27 10:05:05 · 1725 阅读 · 0 评论 -
贪心算法(三)
解题思路:这题可以很直观地使用贪心算法,排序后的坐标,若有重叠,则保留重叠部分坐标,删除一对坐标,最后剩下的坐标数就是需要的弓箭数。这道题其实还是前面提到的区间问题,将字母的起始坐标和结束坐标提取出来,成为一个区间,合并相交的区间。原创 2023-03-26 11:45:17 · 74 阅读 · 0 评论 -
贪心算法(二)
这里的贪心策略体现在处理每一对重叠区间时,只考虑当下哪个区间更有可能和未处理的区间重合。这道题是很明显的贪心策略,只考虑局部(左边和右边是否种花),只要符合条件,就种花。另一个思路就是从反面思考,不考虑如何删除区间,而是考虑如何保留尽可能多的区间。先根据区间左坐标排序,发现重叠的区间后,根据右左标大小删除右左标大的区间。最直观的想法就是删除重叠的区间,且该区间是更有可能与未处理的区间重合的。原则是区间右坐标越小,与未处理的区间重叠可能性越低。贪心策略为保留右左标小且不与其他区间重叠的区间。原创 2023-03-20 09:53:36 · 148 阅读 · 0 评论 -
贪心算法(一)
每个孩子需要与左右两边的孩子比较评分,贪心算法的运用在于从左到右遍历一次评分数组,每个元素只考虑是否比左边的元素大,再从右到左遍历一次评分数组,每个元素只考虑是否比右边的元素大。贪心算法的核心思想是,在处理一个大问题时,划分为多个局部并在每个局部选择最优解,并且认为在每个局部选择最优解,那么最后全局的问题得到的就是最优解。孩子的胃口值需要小于等于饼干大小,根据贪心算法的局部最优解的思想,就是给每个孩子分配能满足她胃口的最小的饼干,且应该优先处理胃口小的孩子。原创 2023-03-19 09:59:11 · 2672 阅读 · 0 评论 -
C++ lamda表达式
有一个 rows x cols 的矩阵,你在单元格上的坐标是 (rCenter, cCenter)。返回矩阵中的所有单元格的坐标,并按与 (rCenter, cCenter) 的 距离 从最小到最大的顺序排。看到题目第一反应是用bfs,一层一层搜索上下左右四个节点,但显然计算量很大,要判断节点是否越界和是否已被访问。单元格(r1, c1) 和 (r2, c2) 之间的距离为|r1 - r2| + |c1 - c2|。[=]: 隐式捕获,方式为值捕获,不需要写明外部变量名字。原创 2023-03-16 09:40:45 · 308 阅读 · 0 评论 -
139. 单词拆分
所以f[i] = true 找到任何一个j( 0原创 2022-10-19 10:53:04 · 93 阅读 · 0 评论 -
115. 不同的子序列
(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)然后无论s[i] t[j]是否相等,都要加上dp[i][j] += dp[i-1][j] 即不考虑s[i]时,已包含的个数。所以得出:if(s[i]==t[j]) dp[i][j] += dp[i-1]+[j-1]给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。dp[i][j]表示s[0...i] 内包含多少个t[0....j]前提条件:当t为“”时,所有dp[i][0]都包含一个t。原创 2022-10-16 20:31:57 · 64 阅读 · 0 评论 -
91. 解码方法
注意,消息不能分组为 (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。进行分类讨论,元素单独存在,或者和前一个元素组合符合题目要求,则分别加上dp[i],dp[i-1]给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数。"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)原创 2022-10-10 10:57:06 · 93 阅读 · 0 评论 -
LEETCODE 72. 编辑距离
dp[i][j] 表示s1[0...i) 和s2[0....j)所需的编辑距离,注意是左闭右开,dp[0][0]表示两个字符串长度为零。初始状态: dp[i][0] = i;删除或增加:dp[i][j] = dp[i][j-1] +1 或 dp[i][j] = dp[i-1][j] + 1。1)s1[i-1]==s2[j-1] 所以 dp[i][j] = dp[i-1][j-1]2) s1[i-1]!替换: dp[i][j] = dp[i-1][j-1]+1。原创 2022-10-09 11:22:49 · 79 阅读 · 0 评论 -
leetcode 64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。对于其他坐标,每次对比左边和上面的元素的最小值,就可以了。非常简单的动态规划,但是还挺能体现动态规划思想的。第一列和第一行只有一种走法,所以直接累加计算路径。说明:每次只能向下或者向右移动一步。原创 2022-10-09 11:13:58 · 182 阅读 · 0 评论 -
LEETCODE 87. 扰乱字符串
或者如果s1[i....i+k-1]==s2[j+l-k.....j+l] 且s1 [i+k....i+l] == s2[j.....j+l-k-1], 则为扰乱字符串。如果s1[i....i+k-1]==s2[j.....j+k-1] 且s1 [i+k.....i+l-1]==s2[j+k......j+l-1],则为扰乱字符串。dp[l][i][j]表示长度为l的字符串,s1的起点为i,s2的起点为j,用k去划分该字符串,要判断整个字符串是不是扰乱字符串,就先从子字符串(长度为1,2,3……原创 2022-10-06 11:40:26 · 115 阅读 · 0 评论 -
LEETCODE 57. 插入区间
怎么修改都还是超时,我觉得唯一的问题就是我为了图方便,直接在res初始化的时候用了原数组Interval。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。这么看来,数组需要合并很多次,所以我一开始就把原数组赋给res,导致了多次erase,增加了时长。一开始看到题目,想要暴力求解,把各种情况都写清楚,分类讨论,然后发现太过复杂。给你一个 无重叠的 ,按照区间起始端点排序的区间列表。于是改成了一边遍历,一边插入元素。1.不相交,且new在该元素左边。原创 2022-10-02 10:11:28 · 165 阅读 · 0 评论 -
LEETCODE 97. 交错字符串
所以状态转移方程是 f[i][j] = (s1[i-1]==s3[i+j-1] && f[i-1][j]) || (s2[j-1]==s3[i+j-1] && f[i][j-1])f[i][j] 表示s3[0......i+j-1] 与s1[0......i-1] s2[0......j-1]交错匹配成功。但显然会存在s1,s2某一段相同的情况,这时候就需要记录index,在选择遍历s1但后面不匹配时,退回到该index。第一个想到的就是贪心算法,轮流遍历s1,s2,哪个能匹配得上s3,就index++原创 2022-09-24 17:12:18 · 162 阅读 · 0 评论 -
leetcode 买卖股票的最佳时机 系列题 (二)
每个坐标能挣的最多的钱为 (i) = max( (i-1), [i] - min_left_value)因为它可以进行两次买卖,所以左右两边各计算一次从左/右出发,当前坐标能挣的最多的钱。一开始想的特简单,觉得找到两个最大的差值就可以了,结果错在一个很简单的例子了。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。再遍历找出坐标i ,有最大的left[i]+right[i]。原创 2022-09-22 17:08:58 · 74 阅读 · 0 评论 -
LEETCODE 132. 分割回文串 II
写成二维数组太复杂,所以用f[i]表示(0,i)的最少分割次数,通过j遍历0到i,如果(j,i)为回文串,f[i] = min (f[i], f[j] +1)这题显然是动态规划的思路。(i,j)的最少分割次数取决于s[i]==s[j] && (i+1,j-1)是否为回文串。那么接下来需要计算的就是(j,i)是否为回文串了,这个可以提前计算好,就不用每次都计算一遍了。分割成一些子串,使每个子串都是回文。原创 2022-09-21 10:19:43 · 103 阅读 · 0 评论 -
LEETCODE 7. 整数反转
原本这题就是一个普通的整数处理,结果因题目要求不能用long long,一直卡在判断越界条件那里。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。看一眼别人的题解,简简单单一个/10就解决了越界判断变量溢出的问题。假设环境不允许存储 64 位整数(有符号或无符号)。原创 2022-09-20 17:02:59 · 270 阅读 · 0 评论 -
LEETCODE 53. 最大子数组和
一开始,最简单的想法就是计算前缀和,sum[i]-sum[i]就是连续子数组的和。针对每个元素,考虑是否加上前面的元素和。只要加上,比当前元素大,就加上,否则舍弃。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。就是复杂度是O(n^2),写出来果不其然超时了。仔细想了想,还是应该用动态规划。是数组中的一个连续部分。原创 2022-09-19 15:58:15 · 78 阅读 · 0 评论 -
LEETCODE 120. 三角形最小路径和
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1。(i,j)只能从(i-1,j)和(i-1,(j-1)抵达,所有只需计算这两条路径哪条更短。给定一个三角形 triangle ,找出自顶向下的最小路径和。自顶向下计算,需要考虑边界的特殊值,还要分情况讨论,比较复杂。j=0, j=i,为特殊情况,只有一种可能抵达。自顶向下,计算每个结点的当前最小路径值。原创 2022-09-16 10:52:17 · 56 阅读 · 0 评论