สมมติว่าเรามีเมทริกซ์ไบนารี เราต้องการหาสี่เหลี่ยมจัตุรัสที่ใหญ่ที่สุดที่ประกอบด้วย 1 ในเมทริกซ์ที่กำหนดนั้น
เช่น ถ้าอินพุตเป็นดังนี้
| 1 | 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 | 0 | 0 |
ผลลัพธ์จะเป็น 16
ขั้นตอนการแก้ปัญหา
- กำหนด
res := 0 - วนลูป
iจาก 0 ถึงขนาดของเมทริกซ์:res := max(res, matrix[i][0])
- วนลูป
iจาก 0 ถึงขนาดของเมทริกซ์[0]:res := max(res, matrix[0][i])
- วนลูป
iจาก 1 ถึงจำนวนแถวของเมทริกซ์:- วนลูป
jจาก 1 ถึงจำนวนคอลัมน์ของเมทริกซ์:- ถ้า
matrix[i][j] == 1แล้ว:matrix[i][j] = min(matrix[i-1][j], matrix[i-1][j-1], matrix[i][j-1]) + 1
res = max(res, matrix[i][j])
- ถ้า
- วนลูป
- คืนค่า
res^2
ตัวอย่างโค้ด
class Solution:
def solve(self, matrix):
res = 0
for i in range(len(matrix)):
res = max(res, matrix[i][0])
for i in range(len(matrix[0])):
res = max(res, matrix[0][i])
for i in range(1, len(matrix)):
for j in range(1, len(matrix[0])):
if matrix[i][j] == 1:
matrix[i][j] = min(matrix[i-1][j], matrix[i-1][j-1], matrix[i][j-1]) + 1
res = max(res, matrix[i][j])
return res * res
ob = Solution()
matrix = [
[1, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0]
]
print(ob.solve(matrix))
อินพุต
matrix = [
[1, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0, 0]
]
เอาต์พุต
16