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
0-1 Backpack Basic Theory(一)
-
Determine the meaning of
dp[i][j]
dp[i][j]
is the maximum value of items that are taken from subscript0
toi
and put into the backpack with capacityj
-
Determine the recursive formula
- Doesn’t contain item i:
dp[i][j]
isdp[i-1][j]
. The itemi
can’t be put into the backpack when the weight of itemi
is greater than the backpackj
weight. So the value of items in the backpack remains the same as before. - Contain item i:
dp[i - 1][j - weight[i]]
is the maximum value when the capacity of backpack isj - weight[i]
and doesn’t contain the itemi
.value[i]
is the value of itemi
. Sodp[i-1][j-weight[i]] + value[i]
is the maximum value when containing the itemi
. - So the recursive formula is:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
;
- Doesn’t contain item i:
-
Initialize the dynamic programming array
- If the capacity of backpack is
0
, likedp[i][0]
. No matter which items are selected, the total value must be0
.
- When
j < weight[0]
,dp[0][j]
should be0
. - When
j >= weight[0]
,dp[0][j]
should bevalue[0]
- According to the recursive formula,
dp[i][j]
is derived from the upper left value. So the other subscripts can be initialized to whatever values, because they will be overwritten. It’s more convenient to initialize the dynamic programming array to0
.
- If the capacity of backpack is
-
Traversal order
- Actually,
traversing item first
andtraversing backpack capacity first
all work. Thetraversing item first
is better understood.
- Actually,
// The size of the weight array is the number of items
for(int i = 1; i < weight.size(); i++) { // Traverse items
for(int j = 0; j <= bagweight; j++) { // Traverse backpack capacity
if (j < weight[i]) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
0-1 Backpack Basic Theory(二)
-
Determine the meaning of
dp[j]
dp[j]
is the maximum value of items carried in the backpack with capacityj
-
Determine the recursive formula
- Doesn’t contain item i:
dp[j]
isdp[i-1][j]
. The itemi
can’t be put into the backpack when the weight of itemi
is greater than the backpackj
weight. So the value of items in the backpack remains the same as before. - Contain item i:
dp[j - weight[i]]
denotes the maximum value of items carried by a backpack with capacityj - weight[i]
and doesn’t contain the itemi
.value[i]
is the value of itemi
. Sodp[j-weight[i]] + value[i]
is the maximum value when containing the itemi
. - So the recursive formula is:
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
;
- Doesn’t contain item i:
-
Initialize the dynamic programming array
- If the capacity of backpack is
0
, likedp[0]
. No matter which items are selected, the total value must be0
. - The dynamic programming array must be derived by taking the number with the largest value. We can initialize the array to
0
. In this way, the dp array will get the maximum value when doing the recursion instead of being overwritten by initial value.
- If the capacity of backpack is
-
Traversal order
- The order of traversing the backpack is different. For
2D
dp traversal, the backpack capacity isfrom small to large
, while for1D
dp traversal, the backpack isfrom large to small
. The reverse order traversal is to ensure that itemi
is only put in once, cause the positive order traversal will lead to item0
be repeatedly added multiple times. - Why don’t we use reverse order for the two-dimensional dp array? Because for two-dimensional dp,
dp[i][j]
are computed through the previous layerdp[i-1][j]
. So thedp[i][j]
of this layer won’t be overwritten. - For the order of the two nested
for
loops. We must adopttraversing item first
instead oftraversing backpack capacity first
. Because if we adopttraversing backpack capacity first
, then only one item will be put in eachdp[j]
(backpack). - The one-dimensional array traversal is still essentially a traversal of a two-dimensional array. The value in the lower right corner depends on the value in the upper left corner of the previous layer. So we need to ensure the left value is still from the previous layer, overwritten from right to the left.
- The order of traversing the backpack is different. For
for(int i = 0; i < weight.size(); i++) { // Traversing items
for(int j = bagWeight; j >= weight[i]; j--) { // Traversing backpack capacity
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
416. Partition Equal Subset Sum
class Solution {
public boolean canPartition(int[] nums) {
if(nums==null || nums.length==0) return false;
int sum = 0;
for(int num : nums)
sum += num;
// if sum is odd number, two subsets can not be equal
if(sum%2 != 0) return false;
int target = sum / 2;
int[] dp = new int[target + 1];
for(int i = 0; i < nums.length; i++){ // Traversing items
for(int j = target; j >= nums[i]; j--) // Traversing capacity
dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
}
return dp[target] == target;
}
}
- The weight and value of item
i
both arenums[i]