- 博客(16)
- 收藏
- 关注
原创 leeCode动态规划123与188.买卖股票的最佳时机
对于 buy1而言,在第 i 天我们可以不进行任何操作,保持不变,也可以在未进行任何操作的前提下以 prices[i] 的价格买入股票,那么 buy1的状态转移方程即为:buy1=max{buy1′ ,−prices[i]} 这里我们buy1′表示第 i−1 天的状态,以便于和第 i 天的状态 buy1进行区分。同理可得sell2 = 0。buy1比buy1’多考虑的是在第i天买入股票的情况,而转移到sell1时,考虑的是在第i天卖出股票的情况,这样在同一天买入并且卖出收益为零,不会对答案产生影响。
2025-05-12 14:36:11
423
原创 LeeCode动态规划309和714 买卖股票的最佳时机
对于f[i][0],我们目前持有的这一支股票可以是在第 i - 1天就已经持有的,对应的状态为f[i-1][0];对于f[i][2],我们在第i天结束之后不持有任何股票并且不处于冷冻期,说明当天没有进行任何操作,即第i - 1天时不持有任何股票:如果处于冷冻期,对应的状态为f[i - 1] [1];对于f[i][1],我们在第i天结束之后处于冷冻期的原因是当天卖出了股票,那么说明在第i - 1天时我们必须持有一支股票,对应的状态为f[i - 1][0] 加上卖出股票的正收益prices[i]。
2025-05-12 00:06:03
251
原创 动态规划1312.让字符串成为回文串的最少插入次数
我们同样可以断定,回文中心cc一定是原字符串中的两个字符,否则如果cc中有至少一个是通过操作添加的字符,那么我们可以舍弃这些操作,此时s’成为长度为偶数(舍弃一次操作)或奇数(舍弃两次操作)的字符串,并且它仍是回文串(在例子中,即“adggda”->“adgda"或”adggda”->“adda”)。我们可以断定,回文中心c一定是原字符串s中的字符,否则如果c是通过操作添加的字符,那么我们可以舍弃这一步操作,此时s’成为长度为偶数的字符串,并且它仍是回文串(在例子中,即"adgda"->“adda”)。
2025-05-11 21:41:55
770
原创 LeeCode1964 找出到每个位置为止最长的有效障碍赛跑路线
给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,其中 obstacles[i] 表示第 i 个障碍的高度。返回长度为 n 的答案数组 ans ,其中 ans[i] 是上面所述的下标 i 对应的最长障碍赛跑路线的长度。输入:obstacles = [3,1,5,6,4,2]输入:obstacles = [1,2,3,2]输入:obstacles = [2,2,1]在这条路线中,必须包含第 i 个障碍。输出:[1,1,2,3,2,2]输出:[1,2,3,3]输出:[1,2,1]
2025-05-10 13:56:53
213
原创 LeeCode1143与1035(最长公共子序列)
ik, j1 < j2 < …//------------------------------------------------------------------------分隔线-----------------------------------------------------------------------要得到nums1[0:i] 和 nums2[0:j]的最长公共子序列,应取两项中的长度较大的一项,因此dp[i][j] = max(dp[i-1][j],dp[i][j-1])。
2025-05-10 13:49:11
630
原创 LeeCode动态规划1964.找出到每个位置为止最长的有效障碍赛跑路线
给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,其中 obstacles[i] 表示第 i 个障碍的高度。返回长度为 n 的答案数组 ans ,其中 ans[i] 是上面所述的下标 i 对应的最长障碍赛跑路线的长度。输入:obstacles = [3,1,5,6,4,2]输入:obstacles = [1,2,3,2]输入:obstacles = [2,2,1]在这条路线中,必须包含第 i 个障碍。输出:[1,1,2,3,2,2]输出:[1,2,3,3]输出:[1,2,1]
2025-05-08 20:39:04
156
原创 LeeCode354.俄罗斯套娃信封问题
给你一个二维整数数组envelopes,其中envelopes[i] = [wi,hi],表示第i个信封的宽度和高度。当另外一个信封的宽恕和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输入:envelopes = [[1,1],[1,1],[1,1]]注意:不允许旋转信封。
2025-05-08 13:07:42
131
原创 LeeCode 动态规划1027.等长等差数列
在上面的状态转移方程中,我们发现,当状态的第一维从i-1变成i后,实际上只有f[i][d][nums[i]]可能会相较于f[i-1][d][nums[i]]的值发生变化,而其余的值均保持不变。并且f[i-1][d][nums[i]-d]本身也需要是一个合法的状态,即必须要存在以nums[i]-d为末项的等差数组。记f[i][d][num]表示使用数组nums中下标小于等于i的元素,构造公差为d的等差数列,并且最后一个元素为num时,等差数列长度的。输入:nums = [20,1,15,3,10,5,8]
2025-05-07 12:00:17
812
原创 动态规划1218.最长定差子序列
令dp[i]表示以arr[i]为结尾的最长的等差子序列的长度,我们可以在arr[i]左侧找到满足arr[j]=arr[i]-d的元素,将arr[i]加到以arr[j]为结尾的最长的等差子序列的末尾,这样可以递推地从dp[j]计算出dp[i]。由于是在左侧找到一个最近的等于arr[i]-d元素并取其对应dp值,因此直接用dp[v]表示以v结尾的最长的等差子序列的长度,这样dp[v-d]就是我们需要找的左侧元素对应的最长的等差子序列的长度,因此转移方程可以改为。解释:最长的等差子序列是 [1,2,3,4]。
2025-05-07 07:12:04
230
原创 LeeCode 435.无重叠区间
虽然可以用dp求解,不过dp算法时间复杂度为O(n2),这在数据量大时会导致超时,因此需要改进优化,官方给出了改进的贪心求解法,主要思路是对intervals 中的首个区间进行求解,首个区间就是所有可以选择的区间中右端点最小的那个区间,在确定了首个区间后,所有与首个区间不重合的区间就组成了一个规模更小的子问题。由于我们已经按照左端点进行升序排序了,因此只要第j个区间的右端点r[j]没有越过第i个区间的左端点L[i],即R[j]<=L[i],那么第j个区间就与第i个区间不重叠。,l[n-1]以及r[0],…
2025-05-06 17:14:26
147
原创 LeeCode动态规划 673. 最长递增子序列的个数
最长子序列的确定逻辑和300的逻辑一致,但需要引入cnt[i]表示以nums[i]结尾的最长上升子序列的个数,设nums的最长上升子序列的长度为maxLen,那么答案为所有满足dp[i] = maxLen的i所对应的cnt[i]之和。有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。此题是LeeCode动态规划300的进阶版本,300的解析可以转。给定一个未排序的整数数组。返回最长递增子序列的个数。
2025-05-05 15:52:23
257
原创 leecode动态规划300.最长递增子序列
观察示例可以发现,最长子序列的最大值和最小值在遍历原序列的过程中是极有可能进行相应更新的,虽然题目整体思路仍然还是在遍历过程中确定每项最长子序列然后再由下一项和前排项进行比较来确定当前项最大子序列是否延长+1,但由于前面提到的最值更新会导致每一项的最大子序列排列起来不是单向的。因此,它的状态转移方程确定后,题目求解的结果不一定在序列的两端。设nums每一项到起始项的最大子序列长度数组为 dp 有题目可知每一项的最大子序列长度为。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
2025-04-25 10:47:52
169
原创 LeeCode动态规划115.不同的子序列
设:对于已知长度的输入字符串 s 与 t,s[i:] 表示 s 从下标 i 到末尾的子字符串,t[j:] 表示 t 从下标 j 到末尾的子字符串。对于字符 s[i] = 字符 t[j] 时 ,dp[i][j]的匹配计算要么考虑起始字符, 即 dp[i+1][j+1] 两字符串各进一位;因此,dp[i][n] = 1;对于字符串s[i:], 当 i 等于 s 的末尾位 m 时,s[m:]为空字符串,除非 j = n 否则空字符串没有非空字符串子序列,故dp[m][j] = 0;对于字符s[i]!
2025-04-24 00:52:46
341
原创 C++基础 多态实现——利用虚方法实现父类指针调用子类方法
#include <iostream>class Father {public: Father() {}; virtual void Say() { std::cout << "I'm father!" << std::endl; }};class Son :public Father {public: Son() {}; void Say() { std::cout << "I'm son..." <<.
2022-04-10 16:47:38
249
原创 软件工程版本控制——入门篇01:利用git进行代码上传与回档
随着编程学习与工作进度的推进,很可能会出现这种情况:今天测试了一下午的代码,结果左改右改把工程改废了,出现了许多难以追溯的报错,想要推翻下午的修改,回退到上午的版本。一种可行的方法是在上午的时候,先开辟一个新的文件夹backup,复制粘贴备份工程。这样当下午想要回档时,就可以直接调用。这种方法在面对简单、修改频率不大的工程时可以适当使用。但是面对修改频率大且结构复杂的工程时,会非常占用私人电脑的硬盘空间,并且由于备份操作耗时费力,造成回档的版本选择范围有限,非常不灵活。 如果可以"很方便"地...
2021-04-03 03:45:18
632
原创 Qt designer 无响应
部分版本Qt安装后,无法打开designer,从而vs无法打开ui,进行界面编辑。可以尝试将Qt安装目录下的msvcXX(vs版本)\bin里的Qt5WebEngineWidgets.dll和Qt5WebEngineWidgetsd.dll重命名,如Qt5WebEngineWidgets11.dll、Qt5WebEngineWidgetsd11.dll即可解决designer打开无响应的问题。...
2019-05-11 08:34:41
1711
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人