diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index cd561ea6..4375b3f4 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -2727,30 +2727,63 @@ public int minPathSum(int[][] grid) { 题目描述:交易之后需要有一天的冷却时间。 -

- -```html -s0[i] = max(s0[i - 1], s2[i - 1]); // Stay at s0, or rest from s2 -s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]); // Stay at s1, or buy from s0 -s2[i] = s1[i - 1] + prices[i]; // Only one way from s1 -``` +

```java public int maxProfit(int[] prices) { if (prices == null || prices.length == 0) return 0; - int n = prices.length; - int[] s0 = new int[n]; - int[] s1 = new int[n]; - int[] s2 = new int[n]; - s0[0] = 0; - s1[0] = -prices[0]; - s2[0] = Integer.MIN_VALUE; - for (int i = 1; i < n; i++) { - s0[i] = Math.max(s0[i - 1], s2[i - 1]); - s1[i] = Math.max(s1[i - 1], s0[i - 1] - prices[i]); - s2[i] = Math.max(s2[i - 1], s1[i - 1] + prices[i]); + int N = prices.length; + int[] buy = new int[N]; + int[] s1 = new int[N]; + int[] sell = new int[N]; + int[] s2 = new int[N]; + s1[0] = buy[0] = -prices[0]; + sell[0] = s2[0] = 0; + for (int i = 1; i < N; i++) { + buy[i] = s2[i - 1] - prices[i]; + s1[i] = Math.max(buy[i - 1], s1[i - 1]); + sell[i] = Math.max(buy[i - 1], s1[i - 1]) + prices[i]; + s2[i] = Math.max(s2[i - 1], sell[i - 1]); } - return Math.max(s0[n - 1], s2[n - 1]); + return Math.max(sell[N - 1], s2[N - 1]); +} +``` + +**需要交易费用的股票交易** + +[Leetcode : 714. Best Time to Buy and Sell Stock with Transaction Fee (Medium)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/) + +```html +Input: prices = [1, 3, 2, 8, 4, 9], fee = 2 +Output: 8 +Explanation: The maximum profit can be achieved by: +Buying at prices[0] = 1 +Selling at prices[3] = 8 +Buying at prices[4] = 4 +Selling at prices[5] = 9 +The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8. +``` + +题目描述:每交易一次,都要支付一定的费用。 + +

+ +```java +public int maxProfit(int[] prices, int fee) { + int N = prices.length; + int[] buy = new int[N]; + int[] s1 = new int[N]; + int[] sell = new int[N]; + int[] s2 = new int[N]; + s1[0] = buy[0] = -prices[0]; + sell[0] = s2[0] = 0; + for (int i = 1; i < N; i++) { + buy[i] = Math.max(sell[i - 1], s2[i - 1]) - prices[i]; + s1[i] = Math.max(buy[i - 1], s1[i - 1]); + sell[i] = Math.max(buy[i - 1], s1[i - 1]) - fee + prices[i]; + s2[i] = Math.max(s2[i - 1], sell[i - 1]); + } + return Math.max(sell[N - 1], s2[N - 1]); } ``` @@ -3789,6 +3822,45 @@ public void moveZeroes(int[] nums) { } ``` +**数组的度** + +[Leetcode : 697. Degree of an Array (Easy)](https://leetcode.com/problems/degree-of-an-array/description/) + +```html +Input: [1,2,2,3,1,4,2] +Output: 6 +``` + +题目描述:数组的度定义为元素出现的最高频率,例如上面的数组度为 3。要求找到一个最小的子数组,这个子数组的度和原数组一样。 + +```java +public int findShortestSubArray(int[] nums) { + Map numsCnt = new HashMap<>(); + Map numsLastIndex = new HashMap<>(); + Map numsFirstIndex = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + int num = nums[i]; + numsCnt.put(num, numsCnt.getOrDefault(num, 0) + 1); + numsLastIndex.put(num, i); + if (!numsFirstIndex.containsKey(num)) { + numsFirstIndex.put(num, i); + } + } + int maxCnt = 0; + for (int num : nums) { + maxCnt = Math.max(maxCnt, numsCnt.get(num)); + } + int ret = nums.length; + for (int i = 0; i < nums.length; i++) { + int num = nums[i]; + int cnt = numsCnt.get(num); + if (cnt != maxCnt) continue; + ret = Math.min(ret, numsLastIndex.get(num) - numsFirstIndex.get(num) + 1); + } + return ret; +} +``` + **对角元素相等的矩阵** [Leetcode : 766. Toeplitz Matrix (Easy)](https://leetcode.com/problems/toeplitz-matrix/description/) diff --git a/pics/1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png b/pics/1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png new file mode 100644 index 00000000..081bf5aa Binary files /dev/null and b/pics/1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png differ diff --git a/pics/6f4abf41-3728-4a6b-9b94-85eed7ca8163.png b/pics/6f4abf41-3728-4a6b-9b94-85eed7ca8163.png new file mode 100644 index 00000000..1fb8642f Binary files /dev/null and b/pics/6f4abf41-3728-4a6b-9b94-85eed7ca8163.png differ