Skip to content

Commit c17b443

Browse files
committedDec 31, 2021
feat: add solutions to lc problem: No.1292
No.1292.Maximum Side Length of a Square with Sum Less than of Equal to Threshold
1 parent 2e8b371 commit c17b443

File tree

6 files changed

+443
-2
lines changed

6 files changed

+443
-2
lines changed
 

Diff for: ‎solution/1200-1299/1292.Maximum Side Length of a Square with Sum Less than or Equal to Threshold/README.md

+152-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,173 @@
5858

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

61+
二维前缀和。
62+
6163
<!-- tabs:start -->
6264

6365
### **Python3**
6466

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

6769
```python
68-
70+
class Solution:
71+
def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:
72+
m, n = len(mat), len(mat[0])
73+
s = [[0] * 310 for _ in range(310)]
74+
for i in range(m):
75+
for j in range(n):
76+
s[i + 1][j + 1] = s[i][j + 1] + \
77+
s[i + 1][j] - s[i][j] + mat[i][j]
78+
79+
def check(l):
80+
for i in range(m):
81+
for j in range(n):
82+
if i + l - 1 < m and j + l - 1 < n:
83+
i1, j1 = i + l - 1, j + l - 1
84+
t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - \
85+
s[i][j1 + 1] + s[i][j]
86+
if t <= threshold:
87+
return True
88+
return False
89+
90+
left, right = 0, min(m, n)
91+
while left < right:
92+
mid = (left + right + 1) >> 1
93+
if check(mid):
94+
left = mid
95+
else:
96+
right = mid - 1
97+
return left
6998
```
7099

71100
### **Java**
72101

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

75104
```java
105+
class Solution {
106+
public int maxSideLength(int[][] mat, int threshold) {
107+
int m = mat.length, n = mat[0].length;
108+
int[][] s = new int[310][310];
109+
for (int i = 0; i < m; ++i) {
110+
for (int j = 0; j < n; ++j) {
111+
s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + mat[i][j];
112+
}
113+
}
114+
int left = 0, right = Math.min(m, n);
115+
while (left < right) {
116+
int mid = (left + right + 1) >> 1;
117+
if (check(mid, s, m, n, threshold)) {
118+
left = mid;
119+
} else {
120+
right = mid - 1;
121+
}
122+
}
123+
return left;
124+
}
125+
126+
private boolean check(int l, int[][] s, int m, int n, int threshold) {
127+
for (int i = 0; i < m; ++i) {
128+
for (int j = 0; j < n; ++j) {
129+
if (i + l - 1 < m && j + l - 1 < n) {
130+
int i1 = i + l - 1, j1 = j + l - 1;
131+
int t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - s[i][j1 + 1] + s[i][j];
132+
if (t <= threshold) {
133+
return true;
134+
}
135+
}
136+
}
137+
}
138+
return false;
139+
}
140+
}
141+
```
142+
143+
### **C++**
144+
145+
```cpp
146+
class Solution {
147+
public:
148+
int maxSideLength(vector<vector<int>>& mat, int threshold) {
149+
int m = mat.size(), n = mat[0].size();
150+
vector<vector<int>> s(310, vector<int>(310));
151+
for (int i = 0; i < m; ++i)
152+
for (int j = 0; j < n; ++j)
153+
s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + mat[i][j];
154+
int left = 0, right = min(m, n);
155+
while (left < right)
156+
{
157+
int mid = left + right + 1 >> 1;
158+
if (check(mid, s, m, n, threshold)) left = mid;
159+
else right = mid - 1;
160+
}
161+
return left;
162+
}
163+
164+
bool check(int l, vector<vector<int>>& s, int m, int n, int threshold) {
165+
for (int i = 0; i < m; ++i)
166+
{
167+
for (int j = 0; j < n; ++j)
168+
{
169+
if (i + l - 1 < m && j + l - 1 < n)
170+
{
171+
int i1 = i + l - 1, j1 = j + l - 1;
172+
int t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - s[i][j1 + 1] + s[i][j];
173+
if (t <= threshold) return true;
174+
}
175+
}
176+
}
177+
return false;
178+
}
179+
};
180+
```
76181

182+
### **Go**
183+
184+
```go
185+
func maxSideLength(mat [][]int, threshold int) int {
186+
m, n := len(mat), len(mat[0])
187+
s := make([][]int, 310)
188+
for i := 0; i < len(s); i++ {
189+
s[i] = make([]int, 310)
190+
}
191+
for i := 0; i < m; i++ {
192+
for j := 0; j < n; j++ {
193+
s[i+1][j+1] = s[i][j+1] + s[i+1][j] - s[i][j] + mat[i][j]
194+
}
195+
}
196+
left, right := 0, min(m, n)
197+
check := func(l int) bool {
198+
for i := 0; i < m; i++ {
199+
for j := 0; j < n; j++ {
200+
if i+l-1 < m && j+l-1 < n {
201+
i1, j1 := i+l-1, j+l-1
202+
t := s[i1+1][j1+1] - s[i1+1][j] - s[i][j1+1] + s[i][j]
203+
if t <= threshold {
204+
return true
205+
}
206+
}
207+
}
208+
}
209+
return false
210+
}
211+
for left < right {
212+
mid := (left + right + 1) >> 1
213+
if check(mid) {
214+
left = mid
215+
} else {
216+
right = mid - 1
217+
}
218+
}
219+
return left
220+
}
221+
222+
func min(a, b int) int {
223+
if a < b {
224+
return a
225+
}
226+
return b
227+
}
77228
```
78229

79230
### **...**

Diff for: ‎solution/1200-1299/1292.Maximum Side Length of a Square with Sum Less than or Equal to Threshold/README_EN.md

+150-1
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,162 @@
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:
59+
m, n = len(mat), len(mat[0])
60+
s = [[0] * 310 for _ in range(310)]
61+
for i in range(m):
62+
for j in range(n):
63+
s[i + 1][j + 1] = s[i][j + 1] + \
64+
s[i + 1][j] - s[i][j] + mat[i][j]
65+
66+
def check(l):
67+
for i in range(m):
68+
for j in range(n):
69+
if i + l - 1 < m and j + l - 1 < n:
70+
i1, j1 = i + l - 1, j + l - 1
71+
t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - \
72+
s[i][j1 + 1] + s[i][j]
73+
if t <= threshold:
74+
return True
75+
return False
76+
77+
left, right = 0, min(m, n)
78+
while left < right:
79+
mid = (left + right + 1) >> 1
80+
if check(mid):
81+
left = mid
82+
else:
83+
right = mid - 1
84+
return left
5885
```
5986

6087
### **Java**
6188

6289
```java
90+
class Solution {
91+
public int maxSideLength(int[][] mat, int threshold) {
92+
int m = mat.length, n = mat[0].length;
93+
int[][] s = new int[310][310];
94+
for (int i = 0; i < m; ++i) {
95+
for (int j = 0; j < n; ++j) {
96+
s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + mat[i][j];
97+
}
98+
}
99+
int left = 0, right = Math.min(m, n);
100+
while (left < right) {
101+
int mid = (left + right + 1) >> 1;
102+
if (check(mid, s, m, n, threshold)) {
103+
left = mid;
104+
} else {
105+
right = mid - 1;
106+
}
107+
}
108+
return left;
109+
}
110+
111+
private boolean check(int l, int[][] s, int m, int n, int threshold) {
112+
for (int i = 0; i < m; ++i) {
113+
for (int j = 0; j < n; ++j) {
114+
if (i + l - 1 < m && j + l - 1 < n) {
115+
int i1 = i + l - 1, j1 = j + l - 1;
116+
int t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - s[i][j1 + 1] + s[i][j];
117+
if (t <= threshold) {
118+
return true;
119+
}
120+
}
121+
}
122+
}
123+
return false;
124+
}
125+
}
126+
```
127+
128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
int maxSideLength(vector<vector<int>>& mat, int threshold) {
134+
int m = mat.size(), n = mat[0].size();
135+
vector<vector<int>> s(310, vector<int>(310));
136+
for (int i = 0; i < m; ++i)
137+
for (int j = 0; j < n; ++j)
138+
s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + mat[i][j];
139+
int left = 0, right = min(m, n);
140+
while (left < right)
141+
{
142+
int mid = left + right + 1 >> 1;
143+
if (check(mid, s, m, n, threshold)) left = mid;
144+
else right = mid - 1;
145+
}
146+
return left;
147+
}
148+
149+
bool check(int l, vector<vector<int>>& s, int m, int n, int threshold) {
150+
for (int i = 0; i < m; ++i)
151+
{
152+
for (int j = 0; j < n; ++j)
153+
{
154+
if (i + l - 1 < m && j + l - 1 < n)
155+
{
156+
int i1 = i + l - 1, j1 = j + l - 1;
157+
int t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - s[i][j1 + 1] + s[i][j];
158+
if (t <= threshold) return true;
159+
}
160+
}
161+
}
162+
return false;
163+
}
164+
};
165+
```
63166

167+
### **Go**
168+
169+
```go
170+
func maxSideLength(mat [][]int, threshold int) int {
171+
m, n := len(mat), len(mat[0])
172+
s := make([][]int, 310)
173+
for i := 0; i < len(s); i++ {
174+
s[i] = make([]int, 310)
175+
}
176+
for i := 0; i < m; i++ {
177+
for j := 0; j < n; j++ {
178+
s[i+1][j+1] = s[i][j+1] + s[i+1][j] - s[i][j] + mat[i][j]
179+
}
180+
}
181+
left, right := 0, min(m, n)
182+
check := func(l int) bool {
183+
for i := 0; i < m; i++ {
184+
for j := 0; j < n; j++ {
185+
if i+l-1 < m && j+l-1 < n {
186+
i1, j1 := i+l-1, j+l-1
187+
t := s[i1+1][j1+1] - s[i1+1][j] - s[i][j1+1] + s[i][j]
188+
if t <= threshold {
189+
return true
190+
}
191+
}
192+
}
193+
}
194+
return false
195+
}
196+
for left < right {
197+
mid := (left + right + 1) >> 1
198+
if check(mid) {
199+
left = mid
200+
} else {
201+
right = mid - 1
202+
}
203+
}
204+
return left
205+
}
206+
207+
func min(a, b int) int {
208+
if a < b {
209+
return a
210+
}
211+
return b
212+
}
64213
```
65214

66215
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public:
3+
int maxSideLength(vector<vector<int>>& mat, int threshold) {
4+
int m = mat.size(), n = mat[0].size();
5+
vector<vector<int>> s(310, vector<int>(310));
6+
for (int i = 0; i < m; ++i)
7+
for (int j = 0; j < n; ++j)
8+
s[i + 1][j + 1] = s[i][j + 1] + s[i + 1][j] - s[i][j] + mat[i][j];
9+
int left = 0, right = min(m, n);
10+
while (left < right)
11+
{
12+
int mid = left + right + 1 >> 1;
13+
if (check(mid, s, m, n, threshold)) left = mid;
14+
else right = mid - 1;
15+
}
16+
return left;
17+
}
18+
19+
bool check(int l, vector<vector<int>>& s, int m, int n, int threshold) {
20+
for (int i = 0; i < m; ++i)
21+
{
22+
for (int j = 0; j < n; ++j)
23+
{
24+
if (i + l - 1 < m && j + l - 1 < n)
25+
{
26+
int i1 = i + l - 1, j1 = j + l - 1;
27+
int t = s[i1 + 1][j1 + 1] - s[i1 + 1][j] - s[i][j1 + 1] + s[i][j];
28+
if (t <= threshold) return true;
29+
}
30+
}
31+
}
32+
return false;
33+
}
34+
};

0 commit comments

Comments
 (0)