1️⃣.买卖股票I
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//给定一个数组 prices 它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格 你只能选择 某一天 买入这只股票 并选择在 未来的某一个不同的日子 卖出该股票 设计一个算法来计算你所能获取的最大利润返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润 返回 0
class Solution {
public int maxProfit(int[] prices) {
int maxProfit=0;
int minPrice =Integer.MAX_VALUE;
for (int i = 0; i <prices.length ; i++) {
if(minPrice>prices[i]){
minPrice = prices[i];
}
if(maxProfit<prices[i]-minPrice){
maxProfit = prices[i]-minPrice;
}
}
return maxProfit;
}
}
2️⃣.买卖股票II
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天 出售。返回你能获得的最大利润
class Solution {
public int maxProfit(int[] nums) {
int len = nums.length;
int ans =0;
for(int i=1;i<len;i++){
if(nums[i]>nums[i-1]){
ans+=nums[i]-nums[i-1];
}
}
return ans;
}
}
3️⃣.买卖股票III
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
class Solution {
public int maxProfit(int[] prices) {
int fstBuy = Integer.MIN_VALUE, fstSell = 0;
int secBuy = Integer.MIN_VALUE, secSell = 0;
for(int p : prices) {
fstBuy = Math.max(fstBuy, -p);
fstSell = Math.max(fstSell, fstBuy + p);
secBuy = Math.max(secBuy, fstSell - p);
secSell = Math.max(secSell, secBuy + p);
}
return secSell;
}
}
4️⃣.买卖股票IV
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
class Solution {
public int maxProfit(int k, int[] prices) {
int[] buy = new int[k+1];
int[] sale = new int[k+1];
Arrays.fill(buy,Integer.MIN_VALUE);
Arrays.fill(sale,0);
for(int p:prices){
for(int i=1;i<=k;++i){
buy[i] = Math.max(buy[i],sale[i-1]-p);
sale[i] = Math.max(sale[i],buy[i]+p);
}
}
return sale[k];
}
}
5️⃣.买卖股票(有冷冻期)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
class Solution {
public int maxProfit(int[] nums) {
int[][] dp = new int[3][nums.length];
dp[0][0]=-nums[0];
for(int i=1;i<nums.length;++i){
//有股
dp[0][i]=Math.max(dp[0][i-1],dp[2][i-1]-nums[i]);
//没股票 冷冻期
dp[1][i]=dp[0][i-1]+nums[i];
//没股票 非冷冻期
dp[2][i]=Math.max(dp[2][i-1],dp[1][i-1]);
}
return Math.max(dp[1][nums.length-1],dp[2][nums.length-1]);
}
}
6️⃣.买卖股票(有手续费)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
class Solution {
public int maxProfit(int[] prices, int fee) {
int buy = -prices[0],sale=0;
for(int i=1;i<prices.length;++i){
buy = Math.max(buy,sale-prices[i]);
sale = Math.max(sale,buy+prices[i]-fee);
}
return sale;
}
}
2.总结提炼🎯
1