322.零钱兑换
code
1 | class Solution: |
53. 最大子序和
题解
如果直接求最大子序和是不好求的,这里的想法是这样的,用一个变量保存序列和,如果子序列和为负,那么它很不好,就清空,并将当前数字赋给这个和,反之就累加当前值,这个和在整个过程中,是从0增大,然后可能会减小到0,最大子序和一定出现在这个过程中;
code
1 | class Solution(object): |
1 | class Solution: |
17.16. 按摩师
code
1 | class Solution: |
746. 使用最小花费爬楼梯
code
1 | class Solution: |
474. 一和零
code
1 | class Solution: |
300. 最长递增子序列
题解
第一种做法比较简单,也比较好想到,\(dp[i]\)表示第\(i\)个数字结尾的序列最长长度;
第二种做法:用一个数组暂存最长上升子序列\(a\),每遍历到一个数字,用二分把这个数字查到\(a\)里面;给定序列[10,9,2,5,3,7,1]
当遍历到\(7\)的时候,\(a\)里面为[2,3,7]
,当遍历到\(1\)时候,\(1\)插进去为[1,3,7]
,这样并不会影响最长上升子序列的长度,并且,如果原序列中\(1\)后面还有长度超过\(3\)上升子序列,那么整个\(a\)会被更新成更长的上升子序列;
code
1 | class Solution: |
1027. 最长等差数列
题解
思路1:\(dp[i][k]\),表示以\(a[i]\)结尾,公差为\(k\)的最长等差子列长度 在这种情况下,考虑状态转移,仅需要枚举任意两元素\(i、j\),考虑\(j\)到\(i\)的状态转移;
思路2:\(dp[i][j]\),表示以\(a[j]、a[i]\)作为最长等差子列结尾两元素(也就是公差是\(a[i] - a[j]\))的最长长度; 这种情况下,暴力的想,可以枚举\(k\),使\(k、j、i\)三个元素成为一个等差数列,然后考虑状态转移,但这样复杂度很高,然而这个过程是贪心的,即这个\(k\)越大越好(但需要小于\(j\)),我们可以这样做:每一次枚举\(j\)结束后更新answer,并且mp[a[j]] = j
code
1 | int d[2005][20010]; |
1 | int d[2005][2005]; |
978. 最长湍流子数组
code
1 | class Solution { |
787. K 站中转内最便宜的航班
code
1 | class Solution { |
1641. 统计字典序元音字符串的数目
code
1 | class Solution { |
343. 整数拆分
题解
\(dp[i]\)表示对于整数\(i\)拆分成若干整数之后的最大乘积,那么显然的,\(dp[i] = max(dp[i],dp[i - k] * k)(1\leq k\leq i - 1)\);但是这不包括所有情况,\(dp[6] = dp[3] * 3 = 6\),而\(dp[6] = 3 * (6 - 3) = 9\)更大;即\(dp[i] = max(dp[i], j * (i - j))\);
code
1 | class Solution { |
467. 环绕字符串中唯一的子字符串
题解
这题第一次做,把自己给绕进去了,甚至没读懂题目;
题目让我们求\(p\)中有多少个种连续的字符串,连续即题目中所谓的连续;
如果不考虑多少种,仅仅问多少个,这就相当于问有多少个连续子区间,这个比较好求;但这里要求不重复;
定义\(dp[i]\),表示以字符\(i\)结尾的最大连续子串,这样就可以去除重复;比如对于abcbc
,当遍历到第一个c
,\(dp['c'] = 6\),对于后面的bc
,显然他已经包含在dp['c']=6
的情况之内了;还可以尝试模拟这个字符串的情况:abczab
;
- 这个题解里的图的变化情况解释的很好:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/solution/dong-tai-gui-hua-c-by-lcoder55455-y3px/
- 这篇博客对于滑动窗口写的很好:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/solution/xi-fa-dai-ni-xue-suan-fa-yi-ci-gao-ding-qian-zhui-/
code
1 | class Solution { |
357. 计算各个位数不同的数字个数
非常多种写法
1314. 矩阵区域和
650. 只有两个键的键盘
1105. 填充书架
题解
\(dp[i]\)表示\(i\)本书的最小高度,也就是以第\(i\)本书作为最后一层最后一本书,达到的最小高度,我们已经知道前面\(1\)到\(i-1\)本书能达到的最小高度,只要枚举最后一层的书,最后一层一定是包含\(i\)之前的若干本,并且厚度有上限,我们就可以从中更新出最小高度;
code
1 | class Solution { |