Day 1 | 704. Binary Search | 27. Remove Element | 35. Search Insert Position | 34. First and Last Position of Element in Sorted Array
Day 2 | 977. Squares of a Sorted Array | 209. Minimum Size Subarray Sum | 59. Spiral Matrix II
Day 3 | 203. Remove Linked List Elements | 707. Design Linked List | 206. Reverse Linked List
Day 4 | 24. Swap Nodes in Pairs| 19. Remove Nth Node From End of List| 160.Intersection of Two Lists
Day 6 | 242. Valid Anagram | 349. Intersection of Two Arrays | 202. Happy Numbe | 1. Two Sum
Day 7 | 454. 4Sum II | 383. Ransom Note | 15. 3Sum | 18. 4Sum
Day 8 | 344. Reverse String | 541. Reverse String II | 替换空格 | 151.Reverse Words in a String | 左旋转字符串
Day 9 | 28. Find the Index of the First Occurrence in a String | 459. Repeated Substring Pattern
Day 10 | 232. Implement Queue using Stacks | 225. Implement Stack using Queue
Day 11 | 20. Valid Parentheses | 1047. Remove All Adjacent Duplicates In String | 150. Evaluate RPN
Day 13 | 239. Sliding Window Maximum | 347. Top K Frequent Elements
Day 14 | 144.Binary Tree Preorder Traversal | 94.Binary Tree Inorder Traversal| 145.Binary Tree Postorder Traversal
Day 15 | 102. Binary Tree Level Order Traversal | 226. Invert Binary Tree | 101. Symmetric Tree
Day 16 | 104.MaximumDepth of BinaryTree| 111.MinimumDepth of BinaryTree| 222.CountComplete TreeNodes
Day 17 | 110. Balanced Binary Tree | 257. Binary Tree Paths | 404. Sum of Left Leaves
Day 18 | 513. Find Bottom Left Tree Value | 112. Path Sum | 105&106. Construct Binary Tree
Day 20 | 654. Maximum Binary Tree | 617. Merge Two Binary Trees | 700.Search in a Binary Search Tree
Day 21 | 530. Minimum Absolute Difference in BST | 501. Find Mode in Binary Search Tree | 236. Lowes
Day 22 | 235. Lowest Common Ancestor of a BST | 701. Insert into a BST | 450. Delete Node in a BST
Day 23 | 669. Trim a BST | 108. Convert Sorted Array to BST | 538. Convert BST to Greater Tree
Day 24 | 77. Combinations
Day 25 | 216. Combination Sum III | 17. Letter Combinations of a Phone Number
Day 27 | 39. Combination Sum | 40. Combination Sum II | 131. Palindrome Partitioning
Day 28 | 93. Restore IP Addresses | 78. Subsets | 90. Subsets II
Day 29 | 491. Non-decreasing Subsequences | 46. Permutations | 47. Permutations II
Day 30 | 332. Reconstruct Itinerary | 51. N-Queens | 37. Sudoku Solver
Day 31 | 455. Assign Cookies | 376. Wiggle Subsequence | 53. Maximum Subarray
Day 32 | 122. Best Time to Buy and Sell Stock II | 55. Jump Game | 45. Jump Game II
Day 34 | 1005. Maximize Sum Of Array After K Negations | 134. Gas Station | 135. Candy
Day 35 | 860. Lemonade Change | 406. Queue Reconstruction by Height | 452. Minimum Number of Arrows
Day 36 | 435. Non-overlapping Intervals | 763. Partition Labels | 56. Merge Intervals
Day 37 | 738. Monotone Increasing Digits | 714. Best Time to Buy and Sell Stock | 968. BT Camera
Day 38 | 509. Fibonacci Number | 70. Climbing Stairs | 746. Min Cost Climbing Stairs
Day 39 | 62. Unique Paths | 63. Unique Paths II
Day 41 | 343. Integer Break | 96. Unique Binary Search Trees
Day 42 | 0-1 Backpack Basic Theory(一)| 0-1 Backpack Basic Theory(二)| 416. Partition Equal Subset Sum
Day 43 | 1049. Last Stone Weight II | 494. Target Sum | 474. Ones and Zeroes
Day 44 | Full Backpack Basic Theory | 518. Coin Change II | 377. Combination Sum IV
Day 45 | 70. Climbing Stairs | 322. Coin Change | 279. Perfect Squares
Day 46 | 139. Word Break | Backpack Question Summary
Day 48 | 198. House Robber | 213. House Robber II | 337. House Robber III
Day 49 | 121. Best Time to Buy and Sell Stock I | 122. Best Time to Buy and Sell Stock II
123. Best Time to Buy and Sell Stock III
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][5];
dp[0][1] = -prices[0];
dp[0][3] = -prices[0];
for(int i = 1; i < prices.length; i++){
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] - prices[i]);
dp[i][2] = Math.max(dp[i-1][2], dp[i-1][1] + prices[i]);
dp[i][3] = Math.max(dp[i-1][3], dp[i-1][2] - prices[i]);
dp[i][4] = Math.max(dp[i-1][4], dp[i-1][3] + prices[i]);
}
return dp[prices.length-1][4];
}
}
- Meaning of dp array
dp[i][0]: no operation(In fact, we can also not set this state)dp[i][1]: maximum cash of first holding the stock on dayidp[i][2]: maximum cash of first doesn’t holding stocks on dayidp[i][3]: maximum cash of second holding the stock on the dayidp[i][4]: maximum cash of second holding the stock on the dayi- The
holdhere doesn’t meanbuytoday. It is also possible that I bought it yesterday and keep it today.
- Recursion Formula:
- If hold the stock on
i-1day, let’s keep it that way. - If first buy stock on day
i, current cash isdp[i - 1][0] - prices[i] - So the
dp[i][1]should choose the larger one:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]) - If doesn’t hold the the stock on
i - 1, let’s keep it that way. - If first sell stock on day
i, current cash isprices[i] + dp[i - 1][1] - Again
dp[i][2]takes the larger one:dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]) - So
dp[i][3]anddp[i][4]are the similar like above. The complete recursion formulas are as follows.dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i])dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i])dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i])dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i])
- If hold the stock on
- Initialize the DP array
- According to the recursion formula, the values of dp array are derived from
dp[0][0],dp[0][1],dp[0][2],dp[0][3]anddp[0][4] dp[0][0] = 0: no operationdp[0][1] = -prices[0]: buy the stock on day0dp[0][2] = 0: first sell the stock on day0dp[0][3] = -prices[0]: second buy the stock on the day0dp[0][4]= 0: second sell the stock on the day0
- According to the recursion formula, the values of dp array are derived from
- Traversal Order is
from front to back.
188. Best Time to Buy and Sell Stock IV
class Solution {
public int maxProfit(int k, int[] prices) {
int[][] dp = new int[prices.length][2*k+1];
for(int m = 0; m < k; m++)
dp[0][2*m+1] = -prices[0];
for(int i = 1; i < prices.length; i++){
for(int m = 1; m <= k; m++){
// buy
dp[i][2*m-1] = Math.max(dp[i-1][2*m-1], dp[i-1][2*m-2] - prices[i]);
// sell
dp[i][2*m] = Math.max(dp[i-1][2*m], dp[i-1][2*m-1] + prices[i]);
}
}
return dp[prices.length-1][2*k];
}
}
- Compare this question to the
123. Best Time to Buy and Sell Stock III, the most significant difference is buying the stock whenkis odd and selling the stock whenkis even.
股票买卖策略动态规划解题概览,
文章介绍了一系列编程问题,涵盖二分搜索、数组操作、链表、树遍历、股票买卖策略等,重点讲解了动态规划在BestTimetoBuyandSellStock问题中的应用及其扩展版本。
757

被折叠的 条评论
为什么被折叠?



