1 | 给定两个用链表表示的整数,每个节点包含一个数位。 |
1 | /** |
1 | 给定两个用链表表示的整数,每个节点包含一个数位。 |
1 | /** |
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1 | /** |
1 | 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 |
1 | class Solution { |
动态规划表设置
第一维是第i
天,第二维是目前交易的次数k
,第三维是当前是否持有股票dp[i][k][0]
是不持有股票,dp[i][k][1]
是持有股票
基准情况
1 | dp[-1][k][0] = 0, dp[-1][k][1] = -Infinity |
状态转移方程
1 | dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i]) |
1 |
|
dp[i][1][0] = max(dp[i - 1][1][0], dp[i - 1][1][1] + prices[i])
dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][0] - prices[i]) = max(dp[i - 1][1][1], -prices[i])
1 |
|
dp[0][0] = 0;
dp[0][1] = -prices[0];
1 | **状态转移方程** |
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+price[i])
dp[i][1]=Math.max(dp[i-1][1],-price[i]);
1 |
|
如果 k 为正无穷,则 k 和 k - 1 可以看成是相同的
1 | dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i]) |
基准情况
1 | dp[0][0] = 0; |
状态转移方程
1 | dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+price[i]) |
1 | class Solution { |
基准情况
1 | dp[0][1][0] = 0; |
状态转移方程
1 | dp[i][2][0] = max(dp[i - 1][2][0], dp[i - 1][2][1] + prices[i]) |
1 | class Solution { |
一个有收益的交易至少需要两天(在前一天买入,在后一天卖出,前提是买入价格低于卖出价格)。如果股票价格数组的长度为 n
,则有收益的交易的数量最多为 $n / 2$(整数除法)。因此 k
的临界值是 $n / 2$。如果给定的 k
不小于临界值,即 $k >= n / 2$,则可以将 k
扩展为正无穷,此时问题等价于情况二。
可以写出时间复杂度为 $O(nk)$ 和空间复杂度为 $O(nk)$ 的解法。
1 | class Solution { |
但是在有「冷却时间」的情况下,如果在第 i - 1
天卖出了股票,就不能在第 i
天买入股票。因此,如果要在第 i
天买入股票,第二个状态转移方程中就不能使用dp[i - 1][k][0]
,而应该使用 dp[i - 2][k][0]
。状态转移方程中的别的项保持不变,新的状态转移方程如下:
1 | dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i]) |
1 | class Solution { |
由于需要对每次交易付手续费,因此在每次买入或卖出股票之后的收益需要扣除手续费,新的状态转移方程有两种表示方法。
第一种表示方法,在每次买入股票时扣除手续费:
1 | dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i]) |
1 | class Solution { |
第二种表示方法,在每次卖出股票时扣除手续费:
1 | dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i] - fee) |
1 | class Solution { |
参考文献
1 | 作者:Storm |
难度:中等
有一棵特殊的苹果树,一连 n
天,每天都可以长出若干个苹果。在第 i
天,树上会长出 apples[i]
个苹果,这些苹果将会在 days[i]
天后(也就是说,第 i + days[i]
天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0
且 days[i] == 0
表示。
你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n
天之后继续吃苹果。
给你两个长度为 n
的整数数组 days
和 apples
,返回你可以吃掉的苹果的最大数目。
示例 1:
1 | 输入:apples = [1,2,3,5,2], days = [3,2,1,4,2] |
示例 2:
1 | 输入:apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2] |
提示:
apples.length == n
days.length == n
1 <= n <= 2 * 104
0 <= apples[i], days[i] <= 2 * 104
apples[i] = 0
时,days[i] = 0
才成立新产生的和过期日期早的相比,过期日期早的先吃掉
1 | class Solution { |
参考文献
1 | 有一个餐厅,只有一位厨师。你有一个顾客数组 customers ,其中 customers[i] = [arrivali, timei] : |
1 | class Solution { |
1 | 学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。 |
因为学生的数量比较少,所以直接暴力模拟,不新建队列
1 | class Solution { |
1 | class Solution { |
参考文献
作者:bo-he-f 来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | 给定两个字符串 s 和 t,判断它们是否是同构的。 |
1 | s: egg |
1 | class Solution { |
需要我们判断 s 和 t 每个位置上的字符是否都一一对应,即 s 的任意一个字符被 t 中唯一的字符对应,同时 t 的任意一个字符被 s 中唯一的字符对应。这也被称为「双射」的关系。
1 | class Solution { |
参考文献
作者:LeetCode-Solution来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 |
1
10,11,12,13,14,15,16,17,18,19,
1
1 |
1 | 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 |
1 | class Solution { |
1 | class Solution { |
参考文献
剑指Offer第二版
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true