日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jq遍历子元素_leetcode第196周赛第三题统计全 1 子矩形

發(fā)布時(shí)間:2024/1/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jq遍历子元素_leetcode第196周赛第三题统计全 1 子矩形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

leetcode1504. 統(tǒng)計(jì)全 1 子矩形

給你一個(gè)只包含 0 和 1 的 rows * columns 矩陣 mat ,請(qǐng)你返回有多少個(gè) 子矩形 的元素全部都是 1 。

示例 1:

輸入:mat = [[1,0,1],[1,1,0],[1,1,0]] 輸出:13 解釋: 有 6 個(gè) 1x1 的矩形。 有 2 個(gè) 1x2 的矩形。 有 3 個(gè) 2x1 的矩形。 有 1 個(gè) 2x2 的矩形。 有 1 個(gè) 3x1 的矩形。 矩形數(shù)目總共 = 6 + 2 + 3 + 1 + 1 = 13 。

示例 2:

輸入:mat = [[0,1,1,0],[0,1,1,1],[1,1,1,0]] 輸出:24 解釋: 有 8 個(gè) 1x1 的子矩形。 有 5 個(gè) 1x2 的子矩形。 有 2 個(gè) 1x3 的子矩形。 有 4 個(gè) 2x1 的子矩形。 有 2 個(gè) 2x2 的子矩形。 有 2 個(gè) 3x1 的子矩形。 有 1 個(gè) 3x2 的子矩形。 矩形數(shù)目總共 = 8 + 5 + 2 + 4 + 2 + 2 + 1 = 24 。

示例 3:

輸入:mat = [[1,1,1,1,1,1]] 輸出:21

示例 4:

輸入:mat = [[1,0,1],[0,1,0],[1,0,1]] 輸出:5

提示:

  • 1 <= rows <= 150
  • 1 <= columns <= 150
  • 0 <= mat[i][j] <= 1

方法:動(dòng)態(tài)規(guī)劃

思路:

本題的暴力思路就是枚舉所有的矩形(左上角坐標(biāo)和右下角坐標(biāo)),然后計(jì)算這個(gè)矩形內(nèi)是不是都為1;但是這樣枚舉的時(shí)間復(fù)雜度就是O(N ^ 4),計(jì)算矩形內(nèi)部是不是都為1最多需要O(N ^ 2),有太多的重復(fù)計(jì)算,我們需要使用動(dòng)態(tài)規(guī)劃來解決。

我們?cè)O(shè)dp數(shù)組為二維,dp(i,j)表示(i,j)這個(gè)點(diǎn)(包括該點(diǎn))該行左邊連續(xù)的1的個(gè)數(shù)。我們計(jì)算這個(gè)的目的是這樣的,如果以(i,j)為矩形的右下角,那么高為1的那滿足條件的矩形個(gè)數(shù)就為dp(i,j),如下圖所示:

我們計(jì)算出所有的dp之后,我們使用兩層循環(huán)來遍歷所有的點(diǎn),計(jì)算以這個(gè)點(diǎn)為右下角的矩形有多少個(gè)。以該點(diǎn)(i,j)為例,以(i,j)為右下角,高度為1的矩形個(gè)數(shù)為dp(i,j);我們還需要向上遍歷,來計(jì)算以該點(diǎn)(i,j)為右下角,高度為2、3、4...的矩形有多少個(gè)。

當(dāng)遍歷到上一行時(shí),dp(i-1,j)表示(i-1,j)左邊連續(xù)1的個(gè)數(shù),因?yàn)橐獦?gòu)成兩層的矩形,矩形中都為1;所以可以構(gòu)成的矩形的數(shù)量為:min(dp(i,j),dp(i-1,j)),我們維護(hù)這個(gè)數(shù),這個(gè)數(shù)表示這兩層共有的都為1的寬度,繼續(xù)向上遍歷,更新這個(gè)寬度,找到高度為3、4、5...的矩形。

遍歷所有的位置,計(jì)算它為右下角的矩形個(gè)數(shù),返回總數(shù)。

代碼:

class Solution:def numSubmat(self, mat: List[List[int]]) -> int:rows = len(mat)cols = len(mat[0])dp = [[0 for _ in range(cols)] for _ in range(rows)]#dp[i][j]表示第i行,從j開始往左數(shù)連續(xù)有多少個(gè)1for i in range(rows):for j in range(cols):if mat[i][j]:dp[i][j] = dp[i][j-1] + 1 if j > 0 else 1res = 0#遍歷每個(gè)位置,以這個(gè)位置為矩形右下角for i in range(rows):for j in range(cols):#leftnum維護(hù)可以構(gòu)成矩形的最大寬度leftnum = float('inf')#從(i,j)開始向上遍歷,對(duì)于第i行,求出dp(i,j)表示(i,j)左邊的連續(xù)1個(gè)數(shù)#也就是以(i,j)為右下角,高為1,的矩形個(gè)數(shù)(一個(gè)長度對(duì)應(yīng)一個(gè)矩形)#遍歷到i-1行的時(shí)候,更新leftnum,表示第i行和第i-1行從j往左的連續(xù)1的個(gè)數(shù)的#較小值,這就是以(i,j)為右下角,高為2的矩形個(gè)數(shù)#遍歷i上面的所有行,找到所有的(i,j)為右下角,高度分別為1,2,3...,i+1的矩形for k in range(i,-1,-1):leftnum = min(leftnum,dp[k][j])#如果某一行更新后,leftnum為0,那么上面的行就不用看了,break跳出if leftnum == 0:breakres += leftnumreturn res

結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的jq遍历子元素_leetcode第196周赛第三题统计全 1 子矩形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。