Skip to content

Commit 45de283

Browse files
committed
feat: add solutions to lc/lcof2 problems
* lc No.0599.Minimum Index Sum of Two Lists * lcof2 No.104.Combination Sum IV
1 parent f5453a0 commit 45de283

File tree

12 files changed

+394
-4
lines changed

12 files changed

+394
-4
lines changed

lcof2/剑指 Offer II 104. 排列的数目/README.md

+63-1
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,84 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
简单动态规划,`dp[i]` 表示总和为 `i` 的元素组合的个数。
61+
6062
<!-- tabs:start -->
6163

6264
### **Python3**
6365

6466
<!-- 这里可写当前语言的特殊实现逻辑 -->
6567

6668
```python
67-
69+
class Solution:
70+
def combinationSum4(self, nums: List[int], target: int) -> int:
71+
dp = [0] * (target + 1)
72+
dp[0] = 1
73+
for i in range(1, target + 1):
74+
for num in nums:
75+
if i >= num:
76+
dp[i] += dp[i - num]
77+
return dp[-1]
6878
```
6979

7080
### **Java**
7181

7282
<!-- 这里可写当前语言的特殊实现逻辑 -->
7383

7484
```java
85+
class Solution {
86+
87+
public int combinationSum4(int[] nums, int target) {
88+
int[] dp = new int[target + 1];
89+
dp[0] = 1;
90+
for (int i = 1; i <= target; ++i) {
91+
for (int num : nums) {
92+
if (i >= num) {
93+
dp[i] += dp[i - num];
94+
}
95+
}
96+
}
97+
return dp[target];
98+
}
99+
}
100+
101+
```
102+
103+
### **C++**
104+
105+
```cpp
106+
class Solution {
107+
public:
108+
int combinationSum4(vector<int>& nums, int target) {
109+
vector<int> dp(target + 1);
110+
dp[0] = 1;
111+
for (int i = 1; i <= target; ++i) {
112+
for (int num : nums) {
113+
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
114+
dp[i] += dp[i - num];
115+
}
116+
}
117+
}
118+
return dp[target];
119+
}
120+
};
121+
```
75122
123+
### **Go**
124+
125+
```go
126+
func combinationSum4(nums []int, target int) int {
127+
dp := make([]int, target+1)
128+
dp[0] = 1
129+
for i := 1; i <= target; i++ {
130+
for _, num := range nums {
131+
if i >= num {
132+
dp[i] += dp[i-num]
133+
}
134+
}
135+
}
136+
return dp[target]
137+
}
76138
```
77139

78140
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int combinationSum4(vector<int>& nums, int target) {
4+
vector<int> dp(target + 1);
5+
dp[0] = 1;
6+
for (int i = 1; i <= target; ++i) {
7+
for (int num : nums) {
8+
if (i >= num && dp[i - num] < INT_MAX - dp[i]) {
9+
dp[i] += dp[i - num];
10+
}
11+
}
12+
}
13+
return dp[target];
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func combinationSum4(nums []int, target int) int {
2+
dp := make([]int, target+1)
3+
dp[0] = 1
4+
for i := 1; i <= target; i++ {
5+
for _, num := range nums {
6+
if i >= num {
7+
dp[i] += dp[i-num]
8+
}
9+
}
10+
}
11+
return dp[target]
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public int combinationSum4(int[] nums, int target) {
3+
int[] dp = new int[target + 1];
4+
dp[0] = 1;
5+
for (int i = 1; i <= target; ++i) {
6+
for (int num : nums) {
7+
if (i >= num) {
8+
dp[i] += dp[i - num];
9+
}
10+
}
11+
}
12+
return dp[target];
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def combinationSum4(self, nums: List[int], target: int) -> int:
3+
dp = [0] * (target + 1)
4+
dp[0] = 1
5+
for i in range(1, target + 1):
6+
for num in nums:
7+
if i >= num:
8+
dp[i] += dp[i - num]
9+
return dp[-1]

solution/0500-0599/0599.Minimum Index Sum of Two Lists/README.md

+101-1
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,122 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
先用哈希表 mp 记录 list2 的每个字符串以及对应的下标。初始化最小的索引和 mi = 2000,ans 表示结果列表,初始值为空。
45+
46+
遍历 list1 每个字符串 v,若 v 在 mp 中,则计算两个字符串的索引和 t,并更新 ans 和 mi。
47+
48+
最后返回 ans 即可。
49+
4450
<!-- tabs:start -->
4551

4652
### **Python3**
4753

4854
<!-- 这里可写当前语言的特殊实现逻辑 -->
4955

5056
```python
51-
57+
class Solution:
58+
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
59+
ans = []
60+
mp = {v: i for i, v in enumerate(list2)}
61+
mi = 2000
62+
for i, v in enumerate(list1):
63+
if v in mp:
64+
t = i + mp[v]
65+
if t < mi:
66+
mi = t
67+
ans = [v]
68+
elif t == mi:
69+
ans.append(v)
70+
return ans
5271
```
5372

5473
### **Java**
5574

5675
<!-- 这里可写当前语言的特殊实现逻辑 -->
5776

5877
```java
78+
class Solution {
79+
80+
public String[] findRestaurant(String[] list1, String[] list2) {
81+
Map<String, Integer> mp = new HashMap<>();
82+
for (int i = 0; i < list2.length; ++i) {
83+
mp.put(list2[i], i);
84+
}
85+
List<String> ans = new ArrayList<>();
86+
int mi = 2000;
87+
for (int i = 0; i < list1.length; ++i) {
88+
if (mp.containsKey(list1[i])) {
89+
int t = i + mp.get(list1[i]);
90+
if (t < mi) {
91+
ans = new ArrayList<>();
92+
ans.add(list1[i]);
93+
mi = t;
94+
} else if (t == mi) {
95+
ans.add(list1[i]);
96+
}
97+
}
98+
}
99+
return ans.toArray(new String[0]);
100+
}
101+
}
102+
103+
```
104+
105+
### **C++**
106+
107+
```cpp
108+
class Solution {
109+
public:
110+
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
111+
unordered_map<string, int> mp;
112+
for (int i = 0; i < list2.size(); ++i) mp[list2[i]] = i;
113+
int mi = 2000;
114+
vector<string> ans;
115+
for (int i = 0; i < list1.size(); ++i)
116+
{
117+
if (mp.count(list1[i]))
118+
{
119+
int t = i + mp[list1[i]];
120+
if (t < mi)
121+
{
122+
ans.clear();
123+
ans.push_back(list1[i]);
124+
mi = t;
125+
}
126+
else if (t == mi)
127+
{
128+
ans.push_back(list1[i]);
129+
}
130+
}
131+
}
132+
return ans;
133+
}
134+
};
135+
```
59136
137+
### **Go**
138+
139+
```cpp
140+
func findRestaurant(list1 []string, list2 []string) []string {
141+
mp := make(map[string]int)
142+
for i, v := range list2 {
143+
mp[v] = i
144+
}
145+
mi := 2000
146+
var ans []string
147+
for i, v := range list1 {
148+
if _, ok := mp[v]; ok {
149+
t := i + mp[v]
150+
if t < mi {
151+
ans = []string{v}
152+
mi = t
153+
} else if t == mi {
154+
ans = append(ans, v)
155+
}
156+
}
157+
}
158+
return ans
159+
}
60160
```
61161

62162
### **...**

solution/0500-0599/0599.Minimum Index Sum of Two Lists/README_EN.md

+95-1
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,107 @@
6464
### **Python3**
6565

6666
```python
67-
67+
class Solution:
68+
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
69+
ans = []
70+
mp = {v: i for i, v in enumerate(list2)}
71+
mi = 2000
72+
for i, v in enumerate(list1):
73+
if v in mp:
74+
t = i + mp[v]
75+
if t < mi:
76+
mi = t
77+
ans = [v]
78+
elif t == mi:
79+
ans.append(v)
80+
return ans
6881
```
6982

7083
### **Java**
7184

7285
```java
86+
class Solution {
87+
88+
public String[] findRestaurant(String[] list1, String[] list2) {
89+
Map<String, Integer> mp = new HashMap<>();
90+
for (int i = 0; i < list2.length; ++i) {
91+
mp.put(list2[i], i);
92+
}
93+
List<String> ans = new ArrayList<>();
94+
int mi = 2000;
95+
for (int i = 0; i < list1.length; ++i) {
96+
if (mp.containsKey(list1[i])) {
97+
int t = i + mp.get(list1[i]);
98+
if (t < mi) {
99+
ans = new ArrayList<>();
100+
ans.add(list1[i]);
101+
mi = t;
102+
} else if (t == mi) {
103+
ans.add(list1[i]);
104+
}
105+
}
106+
}
107+
return ans.toArray(new String[0]);
108+
}
109+
}
110+
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
119+
unordered_map<string, int> mp;
120+
for (int i = 0; i < list2.size(); ++i) mp[list2[i]] = i;
121+
int mi = 2000;
122+
vector<string> ans;
123+
for (int i = 0; i < list1.size(); ++i)
124+
{
125+
if (mp.count(list1[i]))
126+
{
127+
int t = i + mp[list1[i]];
128+
if (t < mi)
129+
{
130+
ans.clear();
131+
ans.push_back(list1[i]);
132+
mi = t;
133+
}
134+
else if (t == mi)
135+
{
136+
ans.push_back(list1[i]);
137+
}
138+
}
139+
}
140+
return ans;
141+
}
142+
};
143+
```
73144
145+
### **Go**
146+
147+
```cpp
148+
func findRestaurant(list1 []string, list2 []string) []string {
149+
mp := make(map[string]int)
150+
for i, v := range list2 {
151+
mp[v] = i
152+
}
153+
mi := 2000
154+
var ans []string
155+
for i, v := range list1 {
156+
if _, ok := mp[v]; ok {
157+
t := i + mp[v]
158+
if t < mi {
159+
ans = []string{v}
160+
mi = t
161+
} else if t == mi {
162+
ans = append(ans, v)
163+
}
164+
}
165+
}
166+
return ans
167+
}
74168
```
75169

76170
### **...**

0 commit comments

Comments
 (0)