309.最佳买卖股票时机含冷冻期
题目链接:309. 最佳买卖股票时机含冷冻期 - 力扣(Leetcode)
解题思路:
首先应该搞清楚dp数组的定义,否则越推越乱
dp(i,j)的含义就是第i天状态为j时的最大利润,这个状态是第i天刚开始的状态。并不是第i天结束时候的状态,所以,第i天进行的各种操作并不会影响当天的dp数组的状态,会改变下一天的状态。
还需要注意的就是初始化的问题,并不是所有题目都是初始化dp(0,0)的,而是要看具体情况,因为本题中持有股票的状态为1,所以就要初始化dp(0,1)而不是dp(0,0)
class Solution {
public int maxProfit(int[] prices) {
/**
* 含有冷冻期的股票交易
* 结点的状态要理解为,结点最初的状态,第i天最初的状态,而不是最后的状态,这个状态不会随着当天的操作而改变
* 状态一共就可以分为三种,0.未持有股票非冷冻期,1.持有股票 2.未持有股票冷冻期
* dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2]);
* dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
* dp[i][2] = dp[i - 1][1] + prices[i];
*/
int[][] dp = new int[prices.length][3];
dp[0][1] = -prices[0];
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
dp[i][2] = dp[i - 1][1] + prices[i];
// dp[i][0] = Math.max(Math.max(dp[i - 1][0], dp[i - 1][2]),dp[i - 1][1] + prices[i]);
// dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
// dp[i][2] = dp[i - 1][0];
}
return Math.max(dp[prices.length - 1][2],dp[prices.length - 1][0]);
}
}
714.买卖股票的最佳时机含手续费
题目链接:714. 买卖股票的最佳时机含手续费 - 力扣(Leetcode)
解题思路:
这个题就比较简单了,记得递推公式加上手续费就行了。
class Solution {
public int maxProfit(int[] prices, int fee) {
/**
* 动态规划解法
* dp[i][j] j状态分为两种 1是持有股票状态,0是未持有股票状态
* dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
* dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
* dp[0][1] = -prices[0];
*/
int[][] dp = new int[prices.length][2];
dp[0][1] = -prices[0];
for(int i = 1; i < prices.length; i++){
dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
}
return dp[prices.length - 1][0];
}
}
1704.判断字符串的两半是否相似
题目链接:1704. 判断字符串的两半是否相似 - 力扣(Leetcode)
解题思路:
值得注意的是将数组转换成List的方式,如果不先创建一个Character[],直接将右侧数组放到Arrays.asList()当中,会报错。应该是跟传入的数组不是对象数组有关。基本数据类型数组没有进行封装。
还需要注意List转为Set的操作。
class Solution {
public boolean halvesAreAlike(String s) {
Character[] c = {'a','e','i','o','u','A','E','I','O','U'};
List<Character> rcd = Arrays.asList(c);
Set<Character> record = new HashSet<>(rcd);
int num = 0;
for(int i = 0; i < s.length() / 2; i++) {
if(record.contains(s.charAt(i))) num++;
}
for(int i = s.length() / 2; i < s.length(); i++){
if(record.contains(s.charAt(i))) num--;
}
if(num == 0) return true;
return false;
}
}
class Solution {
public boolean halvesAreAlike(String s) {
// Character[] c = {'a','e','i','o','u','A','E','I','O','U'};
// List<Character> rcd = Arrays.asList(c);
List<Character> rcd = Arrays.asList(new Character[]{'a','e','i','o','u','A','E','I','O','U'});
Set<Character> record = new HashSet<>(rcd);
int num = 0;
for(int i = 0; i < s.length() / 2; i++) {
if(record.contains(s.charAt(i))) num++;
}
for(int i = s.length() / 2; i < s.length(); i++){
if(record.contains(s.charAt(i))) num--;
}
if(num == 0) return true;
return false;
}
}