Skip to content

Commit 366005b

Browse files
committed
[Function add]
1. Add leetcode questions with tag dp.
1 parent 1568632 commit 366005b

4 files changed

+148
-1
lines changed

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,19 @@
567567
* [282. Expression Add Operators](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/282.%20Expression%20Add%20Operators.md)
568568
* [842. Split Array into Fibonacci Sequence](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/842.%20Split%20Array%20into%20Fibonacci%20Sequence.md)
569569

570+
#### Dynamic Programming
571+
* [70. Climbing Stairs](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/70.%20Climbing%20Stairs.md)
572+
* [746. Min Cost Climbing Stairs](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/746.%20Min%20Cost%20Climbing%20Stairs.md)
573+
* [303. Range Sum Query - Immutable](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/303.%20Range%20Sum%20Query%20-%20Immutable.md)
574+
* [53. Maximum Subarray](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/53.%20Maximum%20Subarray.md)
575+
* [121. Best Time to Buy and Sell Stock](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/121.%20Best%20Time%20to%20Buy%20and%20Sell%20Stock.md)
576+
* [198. House Robber](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/198.%20House%20Robber.md)
577+
* [213. House Robber II](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/213.%20House%20Robber%20II.md)
578+
* [309. Best Time to Buy and Sell Stock with Cooldown](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/309.%20Best%20Time%20to%20Buy%20and%20Sell%20Stock%20with%20Cooldown.md)
579+
* [740. Delete and Earn](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/740.%20Delete%20and%20Earn.md)
580+
* [790. Domino and Tromino Tiling](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/790.%20Domino%20and%20Tromino%20Tiling.md)
581+
* [801. Minimum Swaps To Make Sequences Increasing](https://github.com/Seanforfun/Algorithm-and-Leetcode/blob/master/leetcode/801.%20Minimum%20Swaps%20To%20Make%20Sequences%20Increasing.md)
582+
570583
## Algorithm(4th_Edition)
571584
Reading notes of book Algorithm(4th Algorithm),ISBN: 9787115293800.
572585
All java realization codes are placed in different packages.

leetcode/139. Word Break.md

+32-1
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,35 @@ class Solution {
7272
return dp[len];
7373
}
7474
}
75-
```
75+
```
76+
77+
78+
### Third time
79+
* Method 1: dp
80+
* Initialization: dp[0] = true;
81+
* State transfer function: dp[i] |= dp[i - wordLen];
82+
```Java
83+
class Solution {
84+
public boolean wordBreak(String s, List<String> wordDict) {
85+
Set<String> set = new HashSet<>(wordDict);
86+
Set<Integer> lenSet = new HashSet<>();
87+
int min = Integer.MAX_VALUE;
88+
for(String ss: wordDict){
89+
int temp = ss.length();
90+
lenSet.add(temp);
91+
min = Math.min(min, temp);
92+
}
93+
int len = s.length();
94+
boolean[] dp = new boolean[len + 1];
95+
dp[0] = true;
96+
for(int i = min; i <= len; i ++){
97+
for(int wordLen : lenSet){
98+
if(i - wordLen >= 0){
99+
if(set.contains(s.substring(i - wordLen, i))) dp[i] |= dp[i - wordLen];
100+
}
101+
}
102+
}
103+
return dp[len];
104+
}
105+
}
106+
```

leetcode/140. Word Break II.md

+27
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,30 @@ class Solution {
190190
```
191191

192192

193+
### Third time
194+
* Method 1: reucrsion && dp
195+
```Java
196+
class Solution {
197+
Map<String, List<String>> map = new HashMap<>();
198+
public List<String> wordBreak(String s, List<String> wordDict) {
199+
if(map.containsKey(s)) return map.get(s);
200+
if(s.length() == 0){
201+
List<String> temp = new ArrayList<>();
202+
temp.add("");
203+
map.put("", temp);
204+
}else{
205+
List<String> result = new ArrayList<>();
206+
for(String word: wordDict){
207+
if(s.startsWith(word)){
208+
List<String> res = wordBreak(s.substring(word.length()), wordDict);
209+
for(String ss : res){
210+
result.add(word + (ss.length() == 0 ? ss: " " + ss));
211+
}
212+
}
213+
}
214+
map.put(s, result);
215+
}
216+
return map.get(s);
217+
}
218+
}
219+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
## 801. Minimum Swaps To Make Sequences Increasing
2+
3+
### Question
4+
We have two integer sequences A and B of the same non-zero length.
5+
6+
We are allowed to swap elements A[i] and B[i]. Note that both elements are in the same index position in their respective sequences.
7+
8+
At the end of some number of swaps, A and B are both strictly increasing. (A sequence is strictly increasing if and only if A[0] < A[1] < A[2] < ... < A[A.length - 1].)
9+
10+
Given A and B, return the minimum number of swaps to make both sequences strictly increasing. It is guaranteed that the given input always makes it possible.
11+
12+
```
13+
Example:
14+
Input: A = [1,3,5,4], B = [1,2,3,7]
15+
Output: 1
16+
Explanation:
17+
Swap A[3] and B[3]. Then the sequences are:
18+
A = [1, 3, 5, 7] and B = [1, 2, 3, 4]
19+
which are both strictly increasing.
20+
```
21+
22+
Note:
23+
* A, B are arrays with the same length, and that length will be in the range [1, 1000].
24+
* A[i], B[i] are integer values in the range [0, 2000].
25+
26+
### Solution
27+
* Method 1: dp
28+
* we need to maintain 2 states: keep[i] and swap[i]. i means up to index i, two arrays are strictly increasing.
29+
* keep[i] means index i is not swapped.
30+
* swap[i] means index i is swapped.
31+
* Emample:
32+
* A: [x, x, x, 1 , 4]
33+
* B: [x, x, x, 2 , 3]
34+
* Two conditions:
35+
1. A[i - 1] < A[i] && B[i - 1] < B[i] Up to current index, two arrays have already met the requirement.
36+
* keep[i] = keep[i - 1] Nothing changed
37+
* swap[i] = swap[i - 1] + 1 both changed
38+
* A: [x, x, x, 2, 3]
39+
* B: [x, x, x, 1, 4]
40+
2. A[i - 1] < B[i] && B[i - 1] < A[i]
41+
* keep[i] = min(keep[i], swap[i - 1]) current i is not swapped, previous one swapped
42+
* A: [x, x, x, 2, 4]
43+
* B: [x, x, x, 1, 3]
44+
* swap[i] = min(swap[i], keep[i - 1] + 1) current is swapped, swap previous pair
45+
* A: [x, x, x, 2, 4]
46+
* B: [x, x, x, 1, 3]
47+
* Initialization
48+
* keep[0] = 0
49+
* swap[0] = 1
50+
```Java
51+
class Solution {
52+
public int minSwap(int[] A, int[] B) {
53+
int len = A.length;
54+
if(len <= 1) return 0;
55+
int[] keep = new int[len];
56+
int[] swap = new int[len];
57+
Arrays.fill(keep, Integer.MAX_VALUE);
58+
Arrays.fill(swap, Integer.MAX_VALUE);
59+
keep[0] = 0; swap[0] = 0;
60+
for(int i = 1; i < len; i++){
61+
if(A[i - 1] < A[i] && B[i - 1] < B[i]){
62+
keep[i] = keep[i - 1];
63+
swap[i] = swap[i - 1] + 1;
64+
}
65+
if(A[i] > B[i - 1] && B[i] > A[i - 1]){
66+
keep[i] = Math.min(keep[i], swap[i - 1]);
67+
swap[i] = Math.min(swap[i], keep[i - 1] + 1);
68+
}
69+
}
70+
return Math.min(keep[len - 1], swap[len - 1]);
71+
}
72+
}
73+
```
74+
75+
### Reference
76+
1. [花花酱 LeetCode 801. Minimum Swaps To Make Sequences Increasing - 刷题找工作 EP183](https://www.youtube.com/watch?v=__yxFFRQAl8)

0 commit comments

Comments
 (0)