Skip to content

Commit 6e074dc

Browse files
committed
feat: add solutions to lc problem: No.1439
No.1439.Find the Kth Smallest Sum of a Matrix With Sorted Rows
1 parent cf4325d commit 6e074dc

File tree

6 files changed

+248
-2
lines changed

6 files changed

+248
-2
lines changed

solution/1400-1499/1439.Find the Kth Smallest Sum of a Matrix With Sorted Rows/README.md

+91-1
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,112 @@
5656

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

59+
**方法一:暴力枚举**
60+
61+
注意到 $k$ 的值不超过 $200$,我们逐层遍历,每一层最多保留 $k$ 个数,然后与下一层的 $n$ 个数累加,排序。
62+
63+
最后返回第 $k$ 个数即可。
64+
65+
时间复杂度 $O(m \times n \times k \times \log (n \times k))$,空间复杂度 $O(n \times k)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
66+
5967
<!-- tabs:start -->
6068

6169
### **Python3**
6270

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

6573
```python
66-
74+
class Solution:
75+
def kthSmallest(self, mat: List[List[int]], k: int) -> int:
76+
pre = [0]
77+
for cur in mat:
78+
t = [a + b for a in pre for b in cur[:k]]
79+
t.sort()
80+
pre = t[:k]
81+
return pre[k - 1]
6782
```
6883

6984
### **Java**
7085

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

7388
```java
89+
class Solution {
90+
public int kthSmallest(int[][] mat, int k) {
91+
int m = mat.length, n = mat[0].length;
92+
List<Integer> pre = new ArrayList<>(k);
93+
List<Integer> cur = new ArrayList<>(n * k);
94+
pre.add(0);
95+
for (int[] row : mat) {
96+
cur.clear();
97+
for (int a : pre) {
98+
for (int b : row) {
99+
cur.add(a + b);
100+
}
101+
}
102+
Collections.sort(cur);
103+
pre.clear();
104+
for (int i = 0; i < Math.min(k, cur.size()); ++i) {
105+
pre.add(cur.get(i));
106+
}
107+
}
108+
return pre.get(k - 1);
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
int kthSmallest(vector<vector<int>>& mat, int k) {
119+
int pre[k];
120+
int cur[mat[0].size() * k];
121+
memset(pre, 0, sizeof pre);
122+
int size = 1;
123+
for (auto& row : mat) {
124+
int i = 0;
125+
for (int j = 0; j < size; ++j) {
126+
for (int& v : row) {
127+
cur[i++] = pre[j] + v;
128+
}
129+
}
130+
sort(cur, cur + i);
131+
size = min(i, k);
132+
for (int j = 0; j < size; ++j) {
133+
pre[j] = cur[j];
134+
}
135+
}
136+
return pre[k - 1];
137+
}
138+
};
139+
```
74140
141+
### **Go**
142+
143+
```go
144+
func kthSmallest(mat [][]int, k int) int {
145+
pre := []int{0}
146+
for _, row := range mat {
147+
cur := []int{}
148+
for _, a := range pre {
149+
for _, b := range row {
150+
cur = append(cur, a+b)
151+
}
152+
}
153+
sort.Ints(cur)
154+
pre = cur[:min(k, len(cur))]
155+
}
156+
return pre[k-1]
157+
}
158+
159+
func min(a, b int) int {
160+
if a < b {
161+
return a
162+
}
163+
return b
164+
}
75165
```
76166

77167
### **...**

solution/1400-1499/1439.Find the Kth Smallest Sum of a Matrix With Sorted Rows/README_EN.md

+83-1
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,95 @@
5555
### **Python3**
5656

5757
```python
58-
58+
class Solution:
59+
def kthSmallest(self, mat: List[List[int]], k: int) -> int:
60+
pre = [0]
61+
for cur in mat:
62+
t = [a + b for a in pre for b in cur[:k]]
63+
t.sort()
64+
pre = t[:k]
65+
return pre[k - 1]
5966
```
6067

6168
### **Java**
6269

6370
```java
71+
class Solution {
72+
public int kthSmallest(int[][] mat, int k) {
73+
int m = mat.length, n = mat[0].length;
74+
List<Integer> pre = new ArrayList<>(k);
75+
List<Integer> cur = new ArrayList<>(n * k);
76+
pre.add(0);
77+
for (int[] row : mat) {
78+
cur.clear();
79+
for (int a : pre) {
80+
for (int b : row) {
81+
cur.add(a + b);
82+
}
83+
}
84+
Collections.sort(cur);
85+
pre.clear();
86+
for (int i = 0; i < Math.min(k, cur.size()); ++i) {
87+
pre.add(cur.get(i));
88+
}
89+
}
90+
return pre.get(k - 1);
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
class Solution {
99+
public:
100+
int kthSmallest(vector<vector<int>>& mat, int k) {
101+
int pre[k];
102+
int cur[mat[0].size() * k];
103+
memset(pre, 0, sizeof pre);
104+
int size = 1;
105+
for (auto& row : mat) {
106+
int i = 0;
107+
for (int j = 0; j < size; ++j) {
108+
for (int& v : row) {
109+
cur[i++] = pre[j] + v;
110+
}
111+
}
112+
sort(cur, cur + i);
113+
size = min(i, k);
114+
for (int j = 0; j < size; ++j) {
115+
pre[j] = cur[j];
116+
}
117+
}
118+
return pre[k - 1];
119+
}
120+
};
121+
```
64122
123+
### **Go**
124+
125+
```go
126+
func kthSmallest(mat [][]int, k int) int {
127+
pre := []int{0}
128+
for _, row := range mat {
129+
cur := []int{}
130+
for _, a := range pre {
131+
for _, b := range row {
132+
cur = append(cur, a+b)
133+
}
134+
}
135+
sort.Ints(cur)
136+
pre = cur[:min(k, len(cur))]
137+
}
138+
return pre[k-1]
139+
}
140+
141+
func min(a, b int) int {
142+
if a < b {
143+
return a
144+
}
145+
return b
146+
}
65147
```
66148

67149
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int kthSmallest(vector<vector<int>>& mat, int k) {
4+
int pre[k];
5+
int cur[mat[0].size() * k];
6+
memset(pre, 0, sizeof pre);
7+
int size = 1;
8+
for (auto& row : mat) {
9+
int i = 0;
10+
for (int j = 0; j < size; ++j) {
11+
for (int& v : row) {
12+
cur[i++] = pre[j] + v;
13+
}
14+
}
15+
sort(cur, cur + i);
16+
size = min(i, k);
17+
for (int j = 0; j < size; ++j) {
18+
pre[j] = cur[j];
19+
}
20+
}
21+
return pre[k - 1];
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func kthSmallest(mat [][]int, k int) int {
2+
pre := []int{0}
3+
for _, row := range mat {
4+
cur := []int{}
5+
for _, a := range pre {
6+
for _, b := range row {
7+
cur = append(cur, a+b)
8+
}
9+
}
10+
sort.Ints(cur)
11+
pre = cur[:min(k, len(cur))]
12+
}
13+
return pre[k-1]
14+
}
15+
16+
func min(a, b int) int {
17+
if a < b {
18+
return a
19+
}
20+
return b
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int kthSmallest(int[][] mat, int k) {
3+
int m = mat.length, n = mat[0].length;
4+
List<Integer> pre = new ArrayList<>(k);
5+
List<Integer> cur = new ArrayList<>(n * k);
6+
pre.add(0);
7+
for (int[] row : mat) {
8+
cur.clear();
9+
for (int a : pre) {
10+
for (int b : row) {
11+
cur.add(a + b);
12+
}
13+
}
14+
Collections.sort(cur);
15+
pre.clear();
16+
for (int i = 0; i < Math.min(k, cur.size()); ++i) {
17+
pre.add(cur.get(i));
18+
}
19+
}
20+
return pre.get(k - 1);
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Solution:
2+
def kthSmallest(self, mat: List[List[int]], k: int) -> int:
3+
pre = [0]
4+
for cur in mat:
5+
t = [a + b for a in pre for b in cur[:k]]
6+
t.sort()
7+
pre = t[:k]
8+
return pre[k - 1]

0 commit comments

Comments
 (0)