leetcode-zgd-day51-309.最佳买卖股票时机含冷冻期/714.买卖股票的最佳时机含手续费/1704.判断字符串的两半是否相似

213 阅读1分钟

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;
     }
 }