Skip to content

Commit 09fc30c

Browse files
committed
feat: add solutions to lc problem: No.0378. Kth Smallest Element in a Sorted Matrix
1 parent 2d229e7 commit 09fc30c

File tree

6 files changed

+334
-23
lines changed

6 files changed

+334
-23
lines changed

solution/0300-0399/0378.Kth Smallest Element in a Sorted Matrix/README.md

+120-2
Original file line numberDiff line numberDiff line change
@@ -39,27 +39,145 @@
3939
<li><code>1 <= k <= n<sup>2</sup></code></li>
4040
</ul>
4141

42-
4342
## 解法
4443

4544
<!-- 这里可写通用的实现逻辑 -->
4645

46+
二分法。
47+
4748
<!-- tabs:start -->
4849

4950
### **Python3**
5051

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

5354
```python
54-
55+
class Solution:
56+
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
57+
def check(matrix, mid, k, n):
58+
count = 0
59+
i, j = n - 1, 0
60+
while i >= 0 and j < n:
61+
if matrix[i][j] <= mid:
62+
count += (i + 1)
63+
j += 1
64+
else:
65+
i -= 1
66+
return count >= k
67+
68+
n = len(matrix)
69+
left, right = matrix[0][0], matrix[n - 1][n - 1]
70+
while left < right:
71+
mid = (left + right) >> 1
72+
if check(matrix, mid, k, n):
73+
right = mid
74+
else:
75+
left = mid + 1
76+
return left
5577
```
5678

5779
### **Java**
5880

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

6183
```java
84+
class Solution {
85+
public int kthSmallest(int[][] matrix, int k) {
86+
int n = matrix.length;
87+
int left = matrix[0][0], right = matrix[n - 1][n - 1];
88+
while (left < right) {
89+
int mid = (left + right) >>> 1;
90+
if (check(matrix, mid, k, n)) {
91+
right = mid;
92+
} else {
93+
left = mid + 1;
94+
}
95+
}
96+
return left;
97+
}
98+
99+
private boolean check(int[][] matrix, int mid, int k, int n) {
100+
int count = 0;
101+
int i = n - 1, j = 0;
102+
while (i >= 0 && j < n) {
103+
if (matrix[i][j] <= mid) {
104+
count += (i + 1);
105+
++j;
106+
} else {
107+
--i;
108+
}
109+
}
110+
return count >= k;
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
int kthSmallest(vector<vector<int>>& matrix, int k) {
121+
int n = matrix.size();
122+
int left = matrix[0][0], right = matrix[n - 1][n - 1];
123+
while (left < right) {
124+
int mid = left + right >> 1;
125+
if (check(matrix, mid, k, n)) {
126+
right = mid;
127+
} else {
128+
left = mid + 1;
129+
}
130+
}
131+
return left;
132+
}
133+
134+
private:
135+
bool check(vector<vector<int>>& matrix, int mid, int k, int n) {
136+
int count = 0;
137+
int i = n - 1, j = 0;
138+
while (i >= 0 && j < n) {
139+
if (matrix[i][j] <= mid) {
140+
count += (i + 1);
141+
++j;
142+
} else {
143+
--i;
144+
}
145+
}
146+
return count >= k;
147+
}
148+
};
149+
```
62150
151+
### **Go**
152+
153+
```go
154+
func kthSmallest(matrix [][]int, k int) int {
155+
n := len(matrix)
156+
left, right := matrix[0][0], matrix[n-1][n-1]
157+
for left < right {
158+
mid := (left + right) >> 1
159+
if check(matrix, mid, k, n) {
160+
right = mid
161+
} else {
162+
left = mid + 1
163+
}
164+
}
165+
return left
166+
}
167+
168+
func check(matrix [][]int, mid, k, n int) bool {
169+
count := 0
170+
i, j := n-1, 0
171+
for i >= 0 && j < n {
172+
if matrix[i][j] <= mid {
173+
count += (i + 1)
174+
j++
175+
} else {
176+
i--
177+
}
178+
}
179+
return count >= k
180+
}
63181
```
64182

65183
### **...**

solution/0300-0399/0378.Kth Smallest Element in a Sorted Matrix/README_EN.md

+120-2
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,139 @@
3636
<li><code>1 &lt;= k &lt;= n<sup>2</sup></code></li>
3737
</ul>
3838

39-
4039
## Solutions
4140

41+
Binary search.
42+
4243
<!-- tabs:start -->
4344

4445
### **Python3**
4546

4647
```python
47-
48+
class Solution:
49+
def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
50+
def check(matrix, mid, k, n):
51+
count = 0
52+
i, j = n - 1, 0
53+
while i >= 0 and j < n:
54+
if matrix[i][j] <= mid:
55+
count += (i + 1)
56+
j += 1
57+
else:
58+
i -= 1
59+
return count >= k
60+
61+
n = len(matrix)
62+
left, right = matrix[0][0], matrix[n - 1][n - 1]
63+
while left < right:
64+
mid = (left + right) >> 1
65+
if check(matrix, mid, k, n):
66+
right = mid
67+
else:
68+
left = mid + 1
69+
return left
4870
```
4971

5072
### **Java**
5173

5274
```java
75+
class Solution {
76+
public int kthSmallest(int[][] matrix, int k) {
77+
int n = matrix.length;
78+
int left = matrix[0][0], right = matrix[n - 1][n - 1];
79+
while (left < right) {
80+
int mid = (left + right) >>> 1;
81+
if (check(matrix, mid, k, n)) {
82+
right = mid;
83+
} else {
84+
left = mid + 1;
85+
}
86+
}
87+
return left;
88+
}
89+
90+
private boolean check(int[][] matrix, int mid, int k, int n) {
91+
int count = 0;
92+
int i = n - 1, j = 0;
93+
while (i >= 0 && j < n) {
94+
if (matrix[i][j] <= mid) {
95+
count += (i + 1);
96+
++j;
97+
} else {
98+
--i;
99+
}
100+
}
101+
return count >= k;
102+
}
103+
}
104+
```
105+
106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
int kthSmallest(vector<vector<int>>& matrix, int k) {
112+
int n = matrix.size();
113+
int left = matrix[0][0], right = matrix[n - 1][n - 1];
114+
while (left < right) {
115+
int mid = left + right >> 1;
116+
if (check(matrix, mid, k, n)) {
117+
right = mid;
118+
} else {
119+
left = mid + 1;
120+
}
121+
}
122+
return left;
123+
}
124+
125+
private:
126+
bool check(vector<vector<int>>& matrix, int mid, int k, int n) {
127+
int count = 0;
128+
int i = n - 1, j = 0;
129+
while (i >= 0 && j < n) {
130+
if (matrix[i][j] <= mid) {
131+
count += (i + 1);
132+
++j;
133+
} else {
134+
--i;
135+
}
136+
}
137+
return count >= k;
138+
}
139+
};
140+
```
53141
142+
### **Go**
143+
144+
```go
145+
func kthSmallest(matrix [][]int, k int) int {
146+
n := len(matrix)
147+
left, right := matrix[0][0], matrix[n-1][n-1]
148+
for left < right {
149+
mid := (left + right) >> 1
150+
if check(matrix, mid, k, n) {
151+
right = mid
152+
} else {
153+
left = mid + 1
154+
}
155+
}
156+
return left
157+
}
158+
159+
func check(matrix [][]int, mid, k, n int) bool {
160+
count := 0
161+
i, j := n-1, 0
162+
for i >= 0 && j < n {
163+
if matrix[i][j] <= mid {
164+
count += (i + 1)
165+
j++
166+
} else {
167+
i--
168+
}
169+
}
170+
return count >= k
171+
}
54172
```
55173

56174
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public:
3+
int kthSmallest(vector<vector<int>>& matrix, int k) {
4+
int n = matrix.size();
5+
int left = matrix[0][0], right = matrix[n - 1][n - 1];
6+
while (left < right) {
7+
int mid = left + right >> 1;
8+
if (check(matrix, mid, k, n)) {
9+
right = mid;
10+
} else {
11+
left = mid + 1;
12+
}
13+
}
14+
return left;
15+
}
16+
17+
private:
18+
bool check(vector<vector<int>>& matrix, int mid, int k, int n) {
19+
int count = 0;
20+
int i = n - 1, j = 0;
21+
while (i >= 0 && j < n) {
22+
if (matrix[i][j] <= mid) {
23+
count += (i + 1);
24+
++j;
25+
} else {
26+
--i;
27+
}
28+
}
29+
return count >= k;
30+
}
31+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func kthSmallest(matrix [][]int, k int) int {
2+
n := len(matrix)
3+
left, right := matrix[0][0], matrix[n-1][n-1]
4+
for left < right {
5+
mid := (left + right) >> 1
6+
if check(matrix, mid, k, n) {
7+
right = mid
8+
} else {
9+
left = mid + 1
10+
}
11+
}
12+
return left
13+
}
14+
15+
func check(matrix [][]int, mid, k, n int) bool {
16+
count := 0
17+
i, j := n-1, 0
18+
for i >= 0 && j < n {
19+
if matrix[i][j] <= mid {
20+
count += (i + 1)
21+
j++
22+
} else {
23+
i--
24+
}
25+
}
26+
return count >= k
27+
}

0 commit comments

Comments
 (0)