LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 題目
給你一個(gè)大小為 m x n 的矩陣 mat 和一個(gè)整數(shù)閾值 threshold。
請你返回元素總和小于或等于閾值的正方形區(qū)域的最大邊長;
如果沒有這樣的正方形區(qū)域,則返回 0 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-side-length-of-a-square-with-sum-less-than-or-equal-to-threshold
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
- 先求出左上角(0,0)到任意位置組成的矩形的和
- 然后遍歷所有的 左上頂點(diǎn),再遍歷正方形的邊長
- 時(shí)間復(fù)雜度 O(mn?min(m,n))O(mn*min(m,n))O(mn?min(m,n))
1104 ms 22.6 MB
- 優(yōu)化,下一個(gè)頂點(diǎn),遍歷的長度從maxlen+1開始找
- 和是增大的,一旦大于閾值就不必往下找了
- 這種解法的時(shí)間復(fù)雜度為 O(mn)O(mn)O(mn),可以參考官方題解分析,比最內(nèi)層循環(huán)采用二分查找的方式O(mnlog?(min(m,n))O(mn\log(min(m,n))O(mnlog(min(m,n))更優(yōu)
176 ms 22.5 MB
python3 解答
class Solution:# py3def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:m, n = len(mat), len(mat[0])maxlen = 0prefixsum = [[0]*n for _ in range(m)]prefixsum[0][0] = mat[0][0]for j in range(1,n):prefixsum[0][j] = prefixsum[0][j-1]+mat[0][j]for i in range(1,m):prefixsum[i][0] = prefixsum[i-1][0]+mat[i][0]for i in range(1,m):for j in range(1,n):prefixsum[i][j] = prefixsum[i-1][j]+prefixsum[i][j-1]-prefixsum[i-1][j-1]+mat[i][j]for i in range(m):for j in range(n):length = maxlen+1while length <= min(m,n):ni = i+length-1nj = j+length-1if ni<m and nj<n and prefixsum[ni][nj]-(prefixsum[i-1][nj] if i > 0 else 0)-(prefixsum[ni][j-1] if j > 0 else 0)+(prefixsum[i-1][j-1] if i>0 and j>0 else 0) <= threshold:maxlen = max(maxlen, length)if maxlen == min(m,n):return maxlenelse:breaklength += 1return maxlen1092 ms 19.3 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 609. 在系统中查找
- 下一篇: LeetCode 391. 完美矩形(s