Skip to content

Commit f11560d

Browse files
committed
feat: add solutions to lc problem: No.1727
No.1727.Largest Submatrix With Rearrangements
1 parent 01ecd95 commit f11560d

File tree

9 files changed

+282
-26
lines changed

9 files changed

+282
-26
lines changed

solution/1700-1799/1726.Tuple with Same Product/README.md

+5-8
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,15 @@ public:
120120
121121
```go
122122
func tupleSameProduct(nums []int) int {
123-
product, n := make(map[int]int), len(nums)
124-
for i := 1; i < n; i++ {
123+
cnt := map[int]int{}
124+
for i := 1; i < len(nums); i++ {
125125
for j := 0; j < i; j++ {
126-
multiplier := nums[i] * nums[j]
127-
if _, ok := product[multiplier]; !ok {
128-
product[multiplier] = 0
129-
}
130-
product[multiplier] += 1
126+
x := nums[i] * nums[j]
127+
cnt[x]++
131128
}
132129
}
133130
ans := 0
134-
for _, v := range product {
131+
for _, v := range cnt {
135132
ans += v * (v - 1) / 2
136133
}
137134
return ans << 3

solution/1700-1799/1726.Tuple with Same Product/README_EN.md

+5-8
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,15 @@ public:
106106
107107
```go
108108
func tupleSameProduct(nums []int) int {
109-
product, n := make(map[int]int), len(nums)
110-
for i := 1; i < n; i++ {
109+
cnt := map[int]int{}
110+
for i := 1; i < len(nums); i++ {
111111
for j := 0; j < i; j++ {
112-
multiplier := nums[i] * nums[j]
113-
if _, ok := product[multiplier]; !ok {
114-
product[multiplier] = 0
115-
}
116-
product[multiplier] += 1
112+
x := nums[i] * nums[j]
113+
cnt[x]++
117114
}
118115
}
119116
ans := 0
120-
for _, v := range product {
117+
for _, v := range cnt {
121118
ans += v * (v - 1) / 2
122119
}
123120
return ans << 3

solution/1700-1799/1726.Tuple with Same Product/Solution.go

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
func tupleSameProduct(nums []int) int {
2-
product, n := make(map[int]int), len(nums)
3-
for i := 1; i < n; i++ {
2+
cnt := map[int]int{}
3+
for i := 1; i < len(nums); i++ {
44
for j := 0; j < i; j++ {
5-
multiplier := nums[i] * nums[j]
6-
if _, ok := product[multiplier]; !ok {
7-
product[multiplier] = 0
8-
}
9-
product[multiplier] += 1
5+
x := nums[i] * nums[j]
6+
cnt[x]++
107
}
118
}
129
ans := 0
13-
for _, v := range product {
10+
for _, v := range cnt {
1411
ans += v * (v - 1) / 2
1512
}
1613
return ans << 3

solution/1700-1799/1727.Largest Submatrix With Rearrangements/README.md

+100-1
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,121 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:预处理 + 排序**
67+
68+
由于题目中矩阵是按列进行重排,因此,我们可以先对矩阵的每一列进行预处理。
69+
70+
对于每个值为 $1$ 的元素,我们更新其值为该元素向上的最大连续的 $1$ 的个数,即 $matrix[i][j]=matrix[i-1][j]+1$。
71+
72+
接下来,我们可以对更新后的矩阵的每一行进行排序。然后遍历每一行,计算以该行作为底边的最大全 $1$ 子矩阵的面积。具体计算逻辑如下:
73+
74+
对于矩阵的某一行,我们记第 $k$ 大元素的值为 $val_k$,其中 $k \geq 1$,那么该行至少有 $k$ 个元素不小于 $val_k$,组成的全 $1$ 子矩阵面积为 $val_k \times k$。从大到小遍历矩阵该行的每个元素,取 $val_k \times k$ 的最大值,更新答案。
75+
76+
时间复杂度 $O(m\times n\times \log n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
77+
6678
<!-- tabs:start -->
6779

6880
### **Python3**
6981

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

7284
```python
73-
85+
class Solution:
86+
def largestSubmatrix(self, matrix: List[List[int]]) -> int:
87+
for i in range(1, len(matrix)):
88+
for j in range(len(matrix[0])):
89+
if matrix[i][j]:
90+
matrix[i][j] = matrix[i - 1][j] + 1
91+
ans = 0
92+
for row in matrix:
93+
row.sort(reverse=True)
94+
for j, v in enumerate(row, 1):
95+
ans = max(ans, j * v)
96+
return ans
7497
```
7598

7699
### **Java**
77100

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

80103
```java
104+
class Solution {
105+
public int largestSubmatrix(int[][] matrix) {
106+
int m = matrix.length, n = matrix[0].length;
107+
for (int i = 1; i < m; ++i) {
108+
for (int j = 0; j < n; ++j) {
109+
if (matrix[i][j] == 1) {
110+
matrix[i][j] = matrix[i - 1][j] + 1;
111+
}
112+
}
113+
}
114+
int ans = 0;
115+
for (var row : matrix) {
116+
Arrays.sort(row);
117+
for (int j = n - 1, k = 1; j >= 0 && row[j] > 0; --j, ++k) {
118+
int s = row[j] * k;
119+
ans = Math.max(ans, s);
120+
}
121+
}
122+
return ans;
123+
}
124+
}
125+
```
126+
127+
### **C++**
128+
129+
```cpp
130+
class Solution {
131+
public:
132+
int largestSubmatrix(vector<vector<int>>& matrix) {
133+
int m = matrix.size(), n = matrix[0].size();
134+
for (int i = 1; i < m; ++i) {
135+
for (int j = 0; j < n; ++j) {
136+
if (matrix[i][j]) {
137+
matrix[i][j] = matrix[i - 1][j] + 1;
138+
}
139+
}
140+
}
141+
int ans = 0;
142+
for (auto& row : matrix) {
143+
sort(row.rbegin(), row.rend());
144+
for (int j = 0; j < n; ++j) {
145+
ans = max(ans, (j + 1) * row[j]);
146+
}
147+
}
148+
return ans;
149+
}
150+
};
151+
```
81152
153+
### **Go**
154+
155+
```go
156+
func largestSubmatrix(matrix [][]int) int {
157+
m, n := len(matrix), len(matrix[0])
158+
for i := 1; i < m; i++ {
159+
for j := 0; j < n; j++ {
160+
if matrix[i][j] == 1 {
161+
matrix[i][j] = matrix[i-1][j] + 1
162+
}
163+
}
164+
}
165+
ans := 0
166+
for _, row := range matrix {
167+
sort.Ints(row)
168+
for j, k := n-1, 1; j >= 0 && row[j] > 0; j, k = j-1, k+1 {
169+
ans = max(ans, row[j]*k)
170+
}
171+
}
172+
return ans
173+
}
174+
175+
func max(a, b int) int {
176+
if a > b {
177+
return a
178+
}
179+
return b
180+
}
82181
```
83182

84183
### **...**

solution/1700-1799/1727.Largest Submatrix With Rearrangements/README_EN.md

+88-1
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,100 @@ The largest submatrix of 1s, in bold, has an area of 3.
5252
### **Python3**
5353

5454
```python
55-
55+
class Solution:
56+
def largestSubmatrix(self, matrix: List[List[int]]) -> int:
57+
for i in range(1, len(matrix)):
58+
for j in range(len(matrix[0])):
59+
if matrix[i][j]:
60+
matrix[i][j] = matrix[i - 1][j] + 1
61+
ans = 0
62+
for row in matrix:
63+
row.sort(reverse=True)
64+
for j, v in enumerate(row, 1):
65+
ans = max(ans, j * v)
66+
return ans
5667
```
5768

5869
### **Java**
5970

6071
```java
72+
class Solution {
73+
public int largestSubmatrix(int[][] matrix) {
74+
int m = matrix.length, n = matrix[0].length;
75+
for (int i = 1; i < m; ++i) {
76+
for (int j = 0; j < n; ++j) {
77+
if (matrix[i][j] == 1) {
78+
matrix[i][j] = matrix[i - 1][j] + 1;
79+
}
80+
}
81+
}
82+
int ans = 0;
83+
for (var row : matrix) {
84+
Arrays.sort(row);
85+
for (int j = n - 1, k = 1; j >= 0 && row[j] > 0; --j, ++k) {
86+
int s = row[j] * k;
87+
ans = Math.max(ans, s);
88+
}
89+
}
90+
return ans;
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
class Solution {
99+
public:
100+
int largestSubmatrix(vector<vector<int>>& matrix) {
101+
int m = matrix.size(), n = matrix[0].size();
102+
for (int i = 1; i < m; ++i) {
103+
for (int j = 0; j < n; ++j) {
104+
if (matrix[i][j]) {
105+
matrix[i][j] = matrix[i - 1][j] + 1;
106+
}
107+
}
108+
}
109+
int ans = 0;
110+
for (auto& row : matrix) {
111+
sort(row.rbegin(), row.rend());
112+
for (int j = 0; j < n; ++j) {
113+
ans = max(ans, (j + 1) * row[j]);
114+
}
115+
}
116+
return ans;
117+
}
118+
};
119+
```
61120
121+
### **Go**
122+
123+
```go
124+
func largestSubmatrix(matrix [][]int) int {
125+
m, n := len(matrix), len(matrix[0])
126+
for i := 1; i < m; i++ {
127+
for j := 0; j < n; j++ {
128+
if matrix[i][j] == 1 {
129+
matrix[i][j] = matrix[i-1][j] + 1
130+
}
131+
}
132+
}
133+
ans := 0
134+
for _, row := range matrix {
135+
sort.Ints(row)
136+
for j, k := n-1, 1; j >= 0 && row[j] > 0; j, k = j-1, k+1 {
137+
ans = max(ans, row[j]*k)
138+
}
139+
}
140+
return ans
141+
}
142+
143+
func max(a, b int) int {
144+
if a > b {
145+
return a
146+
}
147+
return b
148+
}
62149
```
63150

64151
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int largestSubmatrix(vector<vector<int>>& matrix) {
4+
int m = matrix.size(), n = matrix[0].size();
5+
for (int i = 1; i < m; ++i) {
6+
for (int j = 0; j < n; ++j) {
7+
if (matrix[i][j]) {
8+
matrix[i][j] = matrix[i - 1][j] + 1;
9+
}
10+
}
11+
}
12+
int ans = 0;
13+
for (auto& row : matrix) {
14+
sort(row.rbegin(), row.rend());
15+
for (int j = 0; j < n; ++j) {
16+
ans = max(ans, (j + 1) * row[j]);
17+
}
18+
}
19+
return ans;
20+
}
21+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func largestSubmatrix(matrix [][]int) int {
2+
m, n := len(matrix), len(matrix[0])
3+
for i := 1; i < m; i++ {
4+
for j := 0; j < n; j++ {
5+
if matrix[i][j] == 1 {
6+
matrix[i][j] = matrix[i-1][j] + 1
7+
}
8+
}
9+
}
10+
ans := 0
11+
for _, row := range matrix {
12+
sort.Ints(row)
13+
for j, k := n-1, 1; j >= 0 && row[j] > 0; j, k = j-1, k+1 {
14+
ans = max(ans, row[j]*k)
15+
}
16+
}
17+
return ans
18+
}
19+
20+
func max(a, b int) int {
21+
if a > b {
22+
return a
23+
}
24+
return b
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int largestSubmatrix(int[][] matrix) {
3+
int m = matrix.length, n = matrix[0].length;
4+
for (int i = 1; i < m; ++i) {
5+
for (int j = 0; j < n; ++j) {
6+
if (matrix[i][j] == 1) {
7+
matrix[i][j] = matrix[i - 1][j] + 1;
8+
}
9+
}
10+
}
11+
int ans = 0;
12+
for (var row : matrix) {
13+
Arrays.sort(row);
14+
for (int j = n - 1, k = 1; j >= 0 && row[j] > 0; --j, ++k) {
15+
int s = row[j] * k;
16+
ans = Math.max(ans, s);
17+
}
18+
}
19+
return ans;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def largestSubmatrix(self, matrix: List[List[int]]) -> int:
3+
for i in range(1, len(matrix)):
4+
for j in range(len(matrix[0])):
5+
if matrix[i][j]:
6+
matrix[i][j] = matrix[i - 1][j] + 1
7+
ans = 0
8+
for row in matrix:
9+
row.sort(reverse=True)
10+
for j, v in enumerate(row, 1):
11+
ans = max(ans, j * v)
12+
return ans

0 commit comments

Comments
 (0)