Skip to content

Commit abb5259

Browse files
committed
feat: add solutions to lc problem: No.1380
No.1380: Lucky Numbers in a Matrix
1 parent e051834 commit abb5259

File tree

7 files changed

+168
-156
lines changed

7 files changed

+168
-156
lines changed

solution/1300-1399/1380.Lucky Numbers in a Matrix/README.md

Lines changed: 60 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,13 @@
5757

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

60-
取行最小值与列最大值的交集即可。
60+
**方法一:维护行最小值和列最大值**
61+
62+
我们可以使用两个数组 $rows$ 和 $cols$ 记录矩阵中每一行的最小值和每一列的最大值,然后遍历矩阵中的每一个元素,检查该元素是否为所在行的最小值且为所在列的最大值,如果是则该元素为幸运数,我们将其加入答案数组。
63+
64+
遍历结束后,我们返回答案数组即可。
65+
66+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
6167

6268
<!-- tabs:start -->
6369

@@ -83,7 +89,7 @@ class Solution {
8389
int m = matrix.length, n = matrix[0].length;
8490
int[] rows = new int[m];
8591
int[] cols = new int[n];
86-
Arrays.fill(rows, Integer.MAX_VALUE);
92+
Arrays.fill(rows, 1 << 30);
8793
for (int i = 0; i < m; ++i) {
8894
for (int j = 0; j < n; ++j) {
8995
rows[i] = Math.min(rows[i], matrix[i][j]);
@@ -94,7 +100,7 @@ class Solution {
94100
for (int i = 0; i < m; ++i) {
95101
for (int j = 0; j < n; ++j) {
96102
if (rows[i] == cols[j]) {
97-
ans.add(matrix[i][j]);
103+
ans.add(rows[i]);
98104
}
99105
}
100106
}
@@ -110,19 +116,24 @@ class Solution {
110116
public:
111117
vector<int> luckyNumbers(vector<vector<int>>& matrix) {
112118
int m = matrix.size(), n = matrix[0].size();
113-
vector<int> rows(m, INT_MAX);
114-
vector<int> cols(n);
119+
int rows[m];
120+
int cols[n];
121+
memset(rows, 0x3f, sizeof(rows));
122+
memset(cols, 0, sizeof(cols));
115123
for (int i = 0; i < m; ++i) {
116124
for (int j = 0; j < n; ++j) {
117125
rows[i] = min(rows[i], matrix[i][j]);
118126
cols[j] = max(cols[j], matrix[i][j]);
119127
}
120128
}
121129
vector<int> ans;
122-
for (int i = 0; i < m; ++i)
123-
for (int j = 0; j < n; ++j)
124-
if (rows[i] == cols[j])
125-
ans.push_back(matrix[i][j]);
130+
for (int i = 0; i < m; ++i) {
131+
for (int j = 0;j < n; ++j) {
132+
if (rows[i] == cols[j]) {
133+
ans.push_back(rows[i]);
134+
}
135+
}
136+
}
126137
return ans;
127138
}
128139
};
@@ -131,41 +142,40 @@ public:
131142
### **Go**
132143
133144
```go
134-
func luckyNumbers (matrix [][]int) []int {
135-
m, n := len(matrix), len(matrix[0])
136-
rows, cols := make([]int, m), make([]int, n)
137-
for i := range rows {
138-
rows[i] = math.MaxInt32
139-
}
140-
for i, row := range matrix {
141-
for j, v := range row {
142-
rows[i] = min(rows[i], v)
143-
cols[j] = max(cols[j], v)
144-
}
145-
}
146-
var ans []int
147-
for i, row := range matrix {
148-
for j, v := range row {
149-
if rows[i] == cols[j] {
150-
ans = append(ans, v)
151-
}
152-
}
153-
}
154-
return ans
145+
func luckyNumbers(matrix [][]int) (ans []int) {
146+
m, n := len(matrix), len(matrix[0])
147+
rows, cols := make([]int, m), make([]int, n)
148+
for i := range rows {
149+
rows[i] = 1 << 30
150+
}
151+
for i, row := range matrix {
152+
for j, x := range row {
153+
rows[i] = min(rows[i], x)
154+
cols[j] = max(cols[j], x)
155+
}
156+
}
157+
for i, row := range matrix {
158+
for j, x := range row {
159+
if rows[i] == cols[j] {
160+
ans = append(ans, x)
161+
}
162+
}
163+
}
164+
return
155165
}
156166
157167
func min(a, b int) int {
158-
if a < b {
159-
return a
160-
}
161-
return b
168+
if a < b {
169+
return a
170+
}
171+
return b
162172
}
163173
164174
func max(a, b int) int {
165-
if a > b {
166-
return a
167-
}
168-
return b
175+
if a > b {
176+
return a
177+
}
178+
return b
169179
}
170180
```
171181

@@ -175,25 +185,23 @@ func max(a, b int) int {
175185
function luckyNumbers(matrix: number[][]): number[] {
176186
const m = matrix.length;
177187
const n = matrix[0].length;
178-
const col = new Array(n).fill(0);
179-
const res = [];
180-
for (let j = 0; j < n; j++) {
181-
for (let i = 0; i < m; i++) {
182-
col[j] = Math.max(col[j], matrix[i][j]);
188+
const rows: number[] = new Array(m).fill(1 << 30);
189+
const cols: number[] = new Array(n).fill(0);
190+
for (let i = 0; i < m; ++i) {
191+
for (let j = 0; j < n; j++) {
192+
rows[i] = Math.min(rows[i], matrix[i][j]);
193+
cols[j] = Math.max(cols[j], matrix[i][j]);
183194
}
184195
}
185-
for (let x = 0; x < m; x++) {
186-
let i = 0;
187-
for (let y = 1; y < n; y++) {
188-
if (matrix[x][i] > matrix[x][y]) {
189-
i = y;
196+
const ans: number[] = [];
197+
for (let i = 0; i < m; ++i) {
198+
for (let j = 0; j < n; j++) {
199+
if (rows[i] === cols[j]) {
200+
ans.push(rows[i]);
190201
}
191202
}
192-
if (matrix[x][i] === col[i]) {
193-
res.push(col[i]);
194-
}
195203
}
196-
return res;
204+
return ans;
197205
}
198206
```
199207

solution/1300-1399/1380.Lucky Numbers in a Matrix/README_EN.md

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class Solution {
6666
int m = matrix.length, n = matrix[0].length;
6767
int[] rows = new int[m];
6868
int[] cols = new int[n];
69-
Arrays.fill(rows, Integer.MAX_VALUE);
69+
Arrays.fill(rows, 1 << 30);
7070
for (int i = 0; i < m; ++i) {
7171
for (int j = 0; j < n; ++j) {
7272
rows[i] = Math.min(rows[i], matrix[i][j]);
@@ -77,7 +77,7 @@ class Solution {
7777
for (int i = 0; i < m; ++i) {
7878
for (int j = 0; j < n; ++j) {
7979
if (rows[i] == cols[j]) {
80-
ans.add(matrix[i][j]);
80+
ans.add(rows[i]);
8181
}
8282
}
8383
}
@@ -93,19 +93,24 @@ class Solution {
9393
public:
9494
vector<int> luckyNumbers(vector<vector<int>>& matrix) {
9595
int m = matrix.size(), n = matrix[0].size();
96-
vector<int> rows(m, INT_MAX);
97-
vector<int> cols(n);
96+
int rows[m];
97+
int cols[n];
98+
memset(rows, 0x3f, sizeof(rows));
99+
memset(cols, 0, sizeof(cols));
98100
for (int i = 0; i < m; ++i) {
99101
for (int j = 0; j < n; ++j) {
100102
rows[i] = min(rows[i], matrix[i][j]);
101103
cols[j] = max(cols[j], matrix[i][j]);
102104
}
103105
}
104106
vector<int> ans;
105-
for (int i = 0; i < m; ++i)
106-
for (int j = 0; j < n; ++j)
107-
if (rows[i] == cols[j])
108-
ans.push_back(matrix[i][j]);
107+
for (int i = 0; i < m; ++i) {
108+
for (int j = 0;j < n; ++j) {
109+
if (rows[i] == cols[j]) {
110+
ans.push_back(rows[i]);
111+
}
112+
}
113+
}
109114
return ans;
110115
}
111116
};
@@ -114,41 +119,40 @@ public:
114119
### **Go**
115120
116121
```go
117-
func luckyNumbers (matrix [][]int) []int {
118-
m, n := len(matrix), len(matrix[0])
119-
rows, cols := make([]int, m), make([]int, n)
120-
for i := range rows {
121-
rows[i] = math.MaxInt32
122-
}
123-
for i, row := range matrix {
124-
for j, v := range row {
125-
rows[i] = min(rows[i], v)
126-
cols[j] = max(cols[j], v)
127-
}
128-
}
129-
var ans []int
130-
for i, row := range matrix {
131-
for j, v := range row {
132-
if rows[i] == cols[j] {
133-
ans = append(ans, v)
134-
}
135-
}
136-
}
137-
return ans
122+
func luckyNumbers(matrix [][]int) (ans []int) {
123+
m, n := len(matrix), len(matrix[0])
124+
rows, cols := make([]int, m), make([]int, n)
125+
for i := range rows {
126+
rows[i] = 1 << 30
127+
}
128+
for i, row := range matrix {
129+
for j, x := range row {
130+
rows[i] = min(rows[i], x)
131+
cols[j] = max(cols[j], x)
132+
}
133+
}
134+
for i, row := range matrix {
135+
for j, x := range row {
136+
if rows[i] == cols[j] {
137+
ans = append(ans, x)
138+
}
139+
}
140+
}
141+
return
138142
}
139143
140144
func min(a, b int) int {
141-
if a < b {
142-
return a
143-
}
144-
return b
145+
if a < b {
146+
return a
147+
}
148+
return b
145149
}
146150
147151
func max(a, b int) int {
148-
if a > b {
149-
return a
150-
}
151-
return b
152+
if a > b {
153+
return a
154+
}
155+
return b
152156
}
153157
```
154158

@@ -158,25 +162,23 @@ func max(a, b int) int {
158162
function luckyNumbers(matrix: number[][]): number[] {
159163
const m = matrix.length;
160164
const n = matrix[0].length;
161-
const col = new Array(n).fill(0);
162-
const res = [];
163-
for (let j = 0; j < n; j++) {
164-
for (let i = 0; i < m; i++) {
165-
col[j] = Math.max(col[j], matrix[i][j]);
165+
const rows: number[] = new Array(m).fill(1 << 30);
166+
const cols: number[] = new Array(n).fill(0);
167+
for (let i = 0; i < m; ++i) {
168+
for (let j = 0; j < n; j++) {
169+
rows[i] = Math.min(rows[i], matrix[i][j]);
170+
cols[j] = Math.max(cols[j], matrix[i][j]);
166171
}
167172
}
168-
for (let x = 0; x < m; x++) {
169-
let i = 0;
170-
for (let y = 1; y < n; y++) {
171-
if (matrix[x][i] > matrix[x][y]) {
172-
i = y;
173+
const ans: number[] = [];
174+
for (let i = 0; i < m; ++i) {
175+
for (let j = 0; j < n; j++) {
176+
if (rows[i] === cols[j]) {
177+
ans.push(rows[i]);
173178
}
174179
}
175-
if (matrix[x][i] === col[i]) {
176-
res.push(col[i]);
177-
}
178180
}
179-
return res;
181+
return ans;
180182
}
181183
```
182184

solution/1300-1399/1380.Lucky Numbers in a Matrix/Solution.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@ class Solution {
22
public:
33
vector<int> luckyNumbers(vector<vector<int>>& matrix) {
44
int m = matrix.size(), n = matrix[0].size();
5-
vector<int> rows(m, INT_MAX);
6-
vector<int> cols(n);
5+
int rows[m];
6+
int cols[n];
7+
memset(rows, 0x3f, sizeof(rows));
8+
memset(cols, 0, sizeof(cols));
79
for (int i = 0; i < m; ++i) {
810
for (int j = 0; j < n; ++j) {
911
rows[i] = min(rows[i], matrix[i][j]);
1012
cols[j] = max(cols[j], matrix[i][j]);
1113
}
1214
}
1315
vector<int> ans;
14-
for (int i = 0; i < m; ++i)
15-
for (int j = 0; j < n; ++j)
16-
if (rows[i] == cols[j])
17-
ans.push_back(matrix[i][j]);
16+
for (int i = 0; i < m; ++i) {
17+
for (int j = 0;j < n; ++j) {
18+
if (rows[i] == cols[j]) {
19+
ans.push_back(rows[i]);
20+
}
21+
}
22+
}
1823
return ans;
1924
}
2025
};

0 commit comments

Comments
 (0)