Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 924c03b

Browse files
committed
add new dp
1 parent 3e79203 commit 924c03b

7 files changed

+384
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
2+
#
3+
# 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
4+
#
5+
# 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
6+
#
7+
#
8+
#
9+
# 示例 1:
10+
#
11+
#
12+
# 输入:[7,1,5,3,6,4]
13+
# 输出:5
14+
# 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
15+
# 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
16+
#
17+
#
18+
# 示例 2:
19+
#
20+
#
21+
# 输入:prices = [7,6,4,3,1]
22+
# 输出:0
23+
# 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
24+
#
25+
#
26+
#
27+
#
28+
# 提示:
29+
#
30+
#
31+
# 1 <= prices.length <= 105
32+
# 0 <= prices[i] <= 104
33+
#
34+
# Related Topics 数组 动态规划
35+
# 👍 2461 👎 0
36+
37+
38+
# leetcode submit region begin(Prohibit modification and deletion)
39+
class Solution:
40+
def maxProfit(self, prices: List[int]) -> int:
41+
# buy = prices[0]
42+
# profit = 0
43+
# for i in prices[1:]:
44+
# profit = max(profit, i-buy)
45+
# buy = min(buy,i)
46+
# return profit
47+
l = len(prices)
48+
dp0 = [prices[0]] + [0] * (l-1)
49+
dp1 = [0] * l
50+
for i in range(1, l):
51+
dp0[i] = min(dp0[i-1], prices[i])
52+
dp1[i] = max(dp1[i-1], prices[i]-dp0[i-1])
53+
return dp1[-1]
54+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
2+
#
3+
# 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
4+
#
5+
# 返回 你能获得的 最大 利润 。
6+
#
7+
#
8+
#
9+
# 示例 1:
10+
#
11+
#
12+
# 输入:prices = [7,1,5,3,6,4]
13+
# 输出:7
14+
# 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
15+
#   随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
16+
# 总利润为 4 + 3 = 7 。
17+
#
18+
# 示例 2:
19+
#
20+
#
21+
# 输入:prices = [1,2,3,4,5]
22+
# 输出:4
23+
# 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
24+
#   总利润为 4 。
25+
#
26+
# 示例 3:
27+
#
28+
#
29+
# 输入:prices = [7,6,4,3,1]
30+
# 输出:0
31+
# 解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。
32+
#
33+
#
34+
#
35+
# 提示:
36+
#
37+
#
38+
# 1 <= prices.length <= 3 * 104
39+
# 0 <= prices[i] <= 104
40+
#
41+
# Related Topics 贪心 数组 动态规划
42+
# 👍 1771 👎 0
43+
44+
45+
# leetcode submit region begin(Prohibit modification and deletion)
46+
class Solution:
47+
def maxProfit(self, prices: List[int]) -> int:
48+
profit = 0
49+
for i in range(1, len(prices)):
50+
profit += max(prices[i]-prices[i-1],0)
51+
return profit
52+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
2+
#
3+
# 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
4+
#
5+
# 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
6+
#
7+
#
8+
#
9+
# 示例 1:
10+
#
11+
#
12+
# 输入:prices = [3,3,5,0,0,3,1,4]
13+
# 输出:6
14+
# 解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
15+
#   随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
16+
#
17+
# 示例 2:
18+
#
19+
#
20+
# 输入:prices = [1,2,3,4,5]
21+
# 输出:4
22+
# 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。  
23+
#   注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。  
24+
#   因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
25+
#
26+
#
27+
# 示例 3:
28+
#
29+
#
30+
# 输入:prices = [7,6,4,3,1]
31+
# 输出:0
32+
# 解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
33+
#
34+
# 示例 4:
35+
#
36+
#
37+
# 输入:prices = [1]
38+
# 输出:0
39+
#
40+
#
41+
#
42+
#
43+
# 提示:
44+
#
45+
#
46+
# 1 <= prices.length <= 105
47+
# 0 <= prices[i] <= 105
48+
#
49+
# Related Topics 数组 动态规划
50+
# 👍 1181 👎 0
51+
52+
53+
# leetcode submit region begin(Prohibit modification and deletion)
54+
class Solution:
55+
def maxProfit(self, prices: List[int]) -> int:
56+
l = len(prices)
57+
dp1 ,dp2, dp3, dp4 = [0] * l, [0] * l, [0] * l, [0] * l
58+
dp1[0]=-prices[0]
59+
dp3[0]=-prices[0]
60+
for i in range(1,l):
61+
dp1[i] = max(dp1[i-1], -prices[i])
62+
dp2[i] = max(dp2[i-1], prices[i]+dp1[i-1])
63+
dp3[i] = max(dp3[i-1], dp2[i-1]-prices[i])
64+
dp4[i] = max(dp4[i-1], prices[i] + dp3[i-1])
65+
return dp4[-1]
66+
67+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
2+
#
3+
# 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
4+
#
5+
# 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
6+
#
7+
#
8+
#
9+
# 示例 1:
10+
#
11+
#
12+
# 输入:k = 2, prices = [2,4,1]
13+
# 输出:2
14+
# 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
15+
#
16+
# 示例 2:
17+
#
18+
#
19+
# 输入:k = 2, prices = [3,2,6,5,0,3]
20+
# 输出:7
21+
# 解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
22+
# 随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3
23+
# 。
24+
#
25+
#
26+
#
27+
# 提示:
28+
#
29+
#
30+
# 0 <= k <= 100
31+
# 0 <= prices.length <= 1000
32+
# 0 <= prices[i] <= 1000
33+
#
34+
# Related Topics 数组 动态规划
35+
# 👍 770 👎 0
36+
37+
38+
# leetcode submit region begin(Prohibit modification and deletion)
39+
class Solution:
40+
def maxProfit(self, k: int, prices: List[int]) -> int:
41+
if not prices:
42+
return 0
43+
l = len(prices)
44+
dp = [[0] * l for i in range(2*k+1)]
45+
for j in range(1, 2*k+1,2):
46+
dp[j][0] = -prices[0]
47+
for i in range(1,l):
48+
for j in range(1, 2*k+1,2):
49+
dp[j][i] = max(dp[j][i - 1], dp[j-1][i-1]-prices[i])
50+
dp[j+1][i] = max(dp[j+1][i - 1], dp[j][i-1] + prices[i])
51+
return dp[-1][-1]
52+
53+
54+
# leetcode submit region end(Prohibit modification and deletion)

script/[509]斐波那契数.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
2+
#
3+
#
4+
# F(0) = 0,F(1) = 1
5+
# F(n) = F(n - 1) + F(n - 2),其中 n > 1
6+
#
7+
#
8+
# 给定 n ,请计算 F(n) 。
9+
#
10+
#
11+
#
12+
# 示例 1:
13+
#
14+
#
15+
# 输入:n = 2
16+
# 输出:1
17+
# 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
18+
#
19+
#
20+
# 示例 2:
21+
#
22+
#
23+
# 输入:n = 3
24+
# 输出:2
25+
# 解释:F(3) = F(2) + F(1) = 1 + 1 = 2
26+
#
27+
#
28+
# 示例 3:
29+
#
30+
#
31+
# 输入:n = 4
32+
# 输出:3
33+
# 解释:F(4) = F(3) + F(2) = 2 + 1 = 3
34+
#
35+
#
36+
#
37+
#
38+
# 提示:
39+
#
40+
#
41+
# 0 <= n <= 30
42+
#
43+
# Related Topics 递归 记忆化搜索 数学 动态规划
44+
# 👍 501 👎 0
45+
46+
47+
# leetcode submit region begin(Prohibit modification and deletion)
48+
class Solution:
49+
def fib(self, n: int) -> int:
50+
dp = [0,1]
51+
if n<2:
52+
return dp[n]
53+
for i in range(1,n):
54+
dp[0],dp[1] = dp[1],dp[0]+dp[1]
55+
return dp[1]
56+
# leetcode submit region end(Prohibit modification and deletion)

script/[70]爬楼梯.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
2+
#
3+
# 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
4+
#
5+
#
6+
#
7+
# 示例 1:
8+
#
9+
#
10+
# 输入:n = 2
11+
# 输出:2
12+
# 解释:有两种方法可以爬到楼顶。
13+
# 1. 1 阶 + 1 阶
14+
# 2. 2 阶
15+
#
16+
# 示例 2:
17+
#
18+
#
19+
# 输入:n = 3
20+
# 输出:3
21+
# 解释:有三种方法可以爬到楼顶。
22+
# 1. 1 阶 + 1 阶 + 1 阶
23+
# 2. 1 阶 + 2 阶
24+
# 3. 2 阶 + 1 阶
25+
#
26+
#
27+
#
28+
#
29+
# 提示:
30+
#
31+
#
32+
# 1 <= n <= 45
33+
#
34+
# Related Topics 记忆化搜索 数学 动态规划
35+
# 👍 2541 👎 0
36+
37+
38+
# leetcode submit region begin(Prohibit modification and deletion)
39+
class Solution:
40+
def climbStairs(self, n: int) -> int:
41+
if n<=2:
42+
return n
43+
dp = [1,1]
44+
for i in range(1, n):
45+
dp[1], dp[0] = dp[1]+dp[0], dp[1]
46+
return dp[1]
47+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
2+
#
3+
# 你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
4+
#
5+
# 返回获得利润的最大值。
6+
#
7+
# 注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
8+
#
9+
#
10+
#
11+
# 示例 1:
12+
#
13+
#
14+
# 输入:prices = [1, 3, 2, 8, 4, 9], fee = 2
15+
# 输出:8
16+
# 解释:能够达到的最大利润:
17+
# 在此处买入 prices[0] = 1
18+
# 在此处卖出 prices[3] = 8
19+
# 在此处买入 prices[4] = 4
20+
# 在此处卖出 prices[5] = 9
21+
# 总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8
22+
#
23+
# 示例 2:
24+
#
25+
#
26+
# 输入:prices = [1,3,7,5,10,3], fee = 3
27+
# 输出:6
28+
#
29+
#
30+
#
31+
#
32+
# 提示:
33+
#
34+
#
35+
# 1 <= prices.length <= 5 * 104
36+
# 1 <= prices[i] < 5 * 104
37+
# 0 <= fee < 5 * 104
38+
#
39+
# Related Topics 贪心 数组 动态规划
40+
# 👍 756 👎 0
41+
42+
43+
# leetcode submit region begin(Prohibit modification and deletion)
44+
class Solution:
45+
def maxProfit(self, prices: List[int], fee: int) -> int:
46+
l = len(prices)
47+
dp1= [0] * l
48+
dp2 = [0]*l
49+
dp1[0] = -prices[0]
50+
for i in range(1,l):
51+
dp1[i] = max(dp1[i-1], -prices[i],dp2[i-1]-prices[i])
52+
dp2[i] = max(dp2[i-1], prices[i]+dp1[i-1]- fee)
53+
return dp2[-1]
54+
# leetcode submit region end(Prohibit modification and deletion)

0 commit comments

Comments
 (0)