国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)

這篇具有很好參考價值的文章主要介紹了藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

題目來源:最大子矩陣 - 藍(lán)橋云課 (lanqiao.cn)

問題描述

小明有一個大小為 N×M?的矩陣, 可以理解為一個?N?行?M?列的二維數(shù)組。

我們定義一個矩陣?m?的穩(wěn)定度?f(m)?為f(m)=max(m)?min(m), 其中 max(m)?表示矩陣?m?中的最大值,?min(m)?表示矩陣?m?中的最小值。

現(xiàn)在小明想要從這個矩陣中找到一個穩(wěn)定度不大于 limit 的子矩陣, 同時他還希望這個子矩陣的面積越大越好 (面積可以理解為矩陣中元素個數(shù))。

子矩陣定義如下: 從原矩陣中選擇一組連續(xù)的行和一組連續(xù)的列, 這些行列交點(diǎn)上的元素組成的矩陣即為一個子矩陣。

輸入格式

第一行輸入兩個整數(shù)?N,M, 表示矩陣的大小

接下來?N?行, 侮行輸入?M?個整數(shù),表示這個矩陣。

最后一行輸入一個整數(shù) limit, 表示限制

輜出格式

輸出一個整數(shù). 分別表示小明選擇的子矩陣的最大面積。

樣例輸入

3 4
2 0 7 9
0 6 9 7
8 4 6 4
8

樣例輸出

6

樣例說明

滿足穩(wěn)定度不大于 8 的且面積最大的子矩陣總共有三個, 他們的面積都是 6 (粗體表示子矩陣元素)

2?0 7 9

0 6?9 7

8 4?6 4? ? ? ? ? ? ?

2 0?7 9

0 6?9 7

8 4?6 4

2 0 7 9

0?6 9 7

8?4 6 4

評測用例規(guī)模與約定

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)

對于所有評測用例,?0≤0≤?矩陣元素值, limit?≤105≤105?。

題目大意

給定一個N*M的二維矩陣和一個數(shù)字limlit,求出符合穩(wěn)定度f(m)<=limit面積最大的子矩陣。
f(m)為當(dāng)前子矩陣的最大值-最小值

解法一:暴力法(通過30%)

????????通過四重循環(huán)(四條邊)枚舉每個子矩陣,然后再計算當(dāng)前子矩陣的最大值和最小值之差,若差值滿足<=limit,則維護(hù)更新面積最大值。
算法復(fù)雜度大于O(n^4)

解法二:?尺取法+單調(diào)隊列(通過100%)

解題關(guān)鍵(三問):

1、如何較為快速地確定當(dāng)前子矩陣的大?。?/h4>

雙指針?biāo)惴?尺取法)

【圖解】尺取法?

1、一開始左右指針都是從左端點(diǎn)開始?

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)?

?2、右指針先向右移動

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)?

3、右指針移動到剛好滿足f(m)<=limit?的臨界位置

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)?

4、右指針再向右移動,這時候在區(qū)間[l, r']就不滿足?f(m)<=limit?

?藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)

5、此時開始移動左指針?

?藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)

6、當(dāng)左指針移動到剛好滿足f(m)<=limit?的臨界位置時,右指針開始移動,這樣周而復(fù)始,直到右指針達(dá)到終點(diǎn)。

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)?

?文章來源地址http://www.zghlxwxcb.cn/news/detail-415617.html

????????觀察數(shù)據(jù),可發(fā)現(xiàn)行的數(shù)據(jù)范圍較小,列的數(shù)據(jù)范圍較大,因此子矩陣的上下邊可以通二.重遍歷確定,復(fù)雜度,子矩陣的左右邊采用雙指針?biāo)惴ㄟM(jìn)行確定,復(fù)雜度。
算法復(fù)雜度

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)??

2、如何較為快速地找出當(dāng)前子矩陣的兩個最值?

????????每次移動左右指針,都會后一整列的數(shù)字進(jìn)入或退出當(dāng)前子矩陣,我們需要先計算出當(dāng)前列[up,down]范圍的最值。優(yōu)化:通過轉(zhuǎn)置矩陣,我們可以利用切片的方式,不用循環(huán)求出原矩陣每一列[up,down]范圍內(nèi)的最值

藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)??

3、當(dāng)前子矩陣實(shí)在不斷移動的,如何在移動過程中維護(hù)最值?

????????使用兩個隊列分別記錄當(dāng)前子矩陣的最大值和最小值,維護(hù)隊列的單調(diào)性,雙指針移動過程中時刻更新隊列。

單調(diào)隊列

維護(hù)最大值的單調(diào)隊列示例:

? ? ? ? ?第一個數(shù)字直接加入隊列,后面每一列如果出現(xiàn)的數(shù)字比隊列最后一個元素小,則加入隊列,否則去掉隊列最后一個元素,?再與隊列最后一個比較,直到隊列為空或者該數(shù)字比隊列最后一個元素小再將該數(shù)字加入隊列。
藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)

?

維護(hù)最大值的單調(diào)隊列,內(nèi)部元素是遞減排列的

維護(hù)最小值的單調(diào)隊列,內(nèi)部元素是遞增排列的

解題思路:雙指針+單調(diào)隊列

1、二重循環(huán)對矩陣的上下邊界進(jìn)行遍歷
2、對于每個確定的上下邊界up,down,左右邊界采用雙指針?biāo)惴ù_定

3、使用兩個隊列分別記錄當(dāng)前子矩陣的最大值和最小值,維護(hù)隊列的單調(diào)性,雙指針移動過程中時刻更新隊列
4、初始res=0保存結(jié)果,雙指針移動過程中維護(hù)最大值

代碼演示

from collections import deque
n, m = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(n)]   # 二維列表存矩陣:n行m列
lim = int(input())
max_res = 0

# 轉(zhuǎn)置矩陣    m行n列  
remat = [[0] * n for _ in range(m)]
for i in range(m):                                          
    for j in range(n):
        remat[i][j] = mat[j][i]

for up in range(n):                # 兩個for循環(huán)遍歷上下邊
    for down in range(up, n):
        l = 0    # 左指針初始化
        maxq = deque() # 最大值的單調(diào)隊列
        minq = deque() # 最小值的單調(diào)隊列
        #maxq.append(max(remat[l][up: down + 1]))    
        #minq.append(min(remat[l][up: down + 1]))
        for r in range(0, m):
            newmax = max(remat[r][up: down + 1])  # 右邊新的一列l(wèi):[up,down]最大值
            while len(maxq) and maxq[-1] < newmax:# 最大值的單調(diào)隊列的最后一個比新的最大值小
                maxq.pop()                        # 刪除隊列最后一個
            maxq.append(newmax)                   # 把新的一列的最大值放入隊列
            newmin = min(remat[r][up: down + 1])  
            while len(minq) and minq[-1] > newmin:
                minq.pop()
            minq.append(newmin)
            cumax, cumin = maxq[0], minq[0]       # 子矩陣的最大值和最小值
            while cumax - cumin > lim and l < r:  # 最大-最小>lim,左指針<右指針
                if len(maxq) and max(remat[l][up: down + 1]) == maxq[0]: # 最左邊的一列的最大值是子矩陣的最大值
                    maxq.popleft()                                       # 刪除最大值,因?yàn)樽笾羔樢蛴乙苿?                if len(minq) and min(remat[l][up: down + 1]) == minq[0]:
                    minq.popleft()
                cumax, cumin = maxq[0], minq[0]        #  更新子矩陣的最大值和最小值
                l += 1                                 #  左指針要向右移動
            if cumax - cumin > lim:                    # 特判:如果l=r且最大-最?。緇im
                continue    
            cu_square = (r - l + 1) * (down - up + 1)  # 計算面積
            max_res = max(max_res, cu_square)
print(max_res)

?

?

?

?

?

到了這里,關(guān)于藍(lán)橋杯刷題016——最大子矩陣(尺取法+單調(diào)隊列)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 藍(lán)橋杯刷題第二十五天

    題目描述 你有一張某海域?NxN?像素的照片,\\\".\\\"表示海洋、\\\"#\\\"表示陸地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中\(zhòng)\\"上下左右\\\"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有 2 座島嶼。 由于全球變暖導(dǎo)致了海面上升,科學(xué)家預(yù)測未來幾十年,島

    2023年04月09日
    瀏覽(28)
  • 藍(lán)橋杯刷題014——求階乘(二分法)

    藍(lán)橋杯刷題014——求階乘(二分法)

    藍(lán)橋杯2022省賽題目 問題描述 滿足?N?! 的末尾恰好有 ?K?個 0 的最小的?N?是多少? 如果這樣的?N?不存在輸出??1?。 輸入格式 一個整數(shù)?K?。 輸出格式 一個整數(shù)代表答案。 樣例輸入 樣例輸出 評測用例規(guī)模與約定 對于?30%?的數(shù)據(jù), 1≤K≤10^6. 對于?100%?的數(shù)據(jù), 1≤K≤10^

    2023年04月12日
    瀏覽(19)
  • 藍(lán)橋杯刷題015——最少刷題數(shù)(二分法+前綴和)

    藍(lán)橋杯刷題015——最少刷題數(shù)(二分法+前綴和)

    問題描述 小藍(lán)老師教的編程課有 ?N?名學(xué)生 , 編號依次是 1…N ?。 第?i?號學(xué)生這學(xué)期刷題的數(shù)量是?Ai?? 。 對于每一名學(xué)生, 請你計算他 至少 還要再刷多少道題 , 才能使得 全班刷題比他多的學(xué)生數(shù)不超過刷題比他少的學(xué)生數(shù)。 輸入格式 第一行包含一個正整數(shù)?N?。 第二

    2023年04月14日
    瀏覽(18)
  • 藍(lán)橋杯刷題沖刺 | 倒計時1天

    藍(lán)橋杯刷題沖刺 | 倒計時1天

    作者:指針不指南嗎 專欄:藍(lán)橋杯倒計時沖刺 ??藍(lán)橋杯加油,大家一定可以?? 我是菜菜,最近容易我犯的錯誤總結(jié) + 一些tips 各位藍(lán)橋杯加油加油 當(dāng)輸入輸出數(shù)據(jù)不超過 1e6 時, scanf printf 和 cin cout 是沒有差距的; 超過這個數(shù)據(jù)范圍時,就是用 scanf printf 多次調(diào)式,自己手

    2023年04月09日
    瀏覽(35)
  • 藍(lán)橋杯刷題沖刺 | 倒計時2天

    藍(lán)橋杯刷題沖刺 | 倒計時2天

    作者:指針不指南嗎 專欄:藍(lán)橋杯倒計時沖刺 ??馬上就要藍(lán)橋杯了,最后的這幾天尤為重要,不可懈怠哦?? 題目 鏈接: 854. Floyd求最短路 - AcWing題庫 給定一個 n 個點(diǎn) m 條邊的有向圖,圖中可能存在重邊和自環(huán),邊權(quán)可能為負(fù)數(shù)。 再給定 k 個詢問,每個詢問包含兩個整數(shù)

    2023年04月10日
    瀏覽(31)
  • 藍(lán)橋杯刷題沖刺 | 倒計時3天

    藍(lán)橋杯刷題沖刺 | 倒計時3天

    作者:指針不指南嗎 專欄:藍(lán)橋杯倒計時沖刺 ??馬上就要藍(lán)橋杯了,最后的這幾天尤為重要,不可懈怠哦?? 題目 鏈接: 790. 數(shù)的三次方根 - AcWing題庫 給定一個浮點(diǎn)數(shù) n,求它的三次方根。 輸入格式 共一行,包含一個浮點(diǎn)數(shù) n。 輸出格式 共一行,包含一個浮點(diǎn)數(shù),表示問

    2023年04月09日
    瀏覽(32)
  • 藍(lán)橋杯刷題沖刺 | 倒計時6天

    藍(lán)橋杯刷題沖刺 | 倒計時6天

    作者:指針不指南嗎 專欄:藍(lán)橋杯倒計時沖刺 ??馬上就要藍(lán)橋杯了,最后的這幾天尤為重要,不可懈怠哦?? 題目 鏈接: 4941. 湊數(shù) - AcWing題庫 初始時,n=0。 每一輪操作都要依次完成兩個步驟: 第一步,任選一個 非負(fù) 整數(shù) a,將 n 增加 a,這一步所需付出的代價為 a。 第二

    2023年04月08日
    瀏覽(124)
  • 【藍(lán)橋杯刷題沖刺輔導(dǎo)】掌握遞歸·DFS解題套路,這一文足以?

    【藍(lán)橋杯刷題沖刺輔導(dǎo)】掌握遞歸·DFS解題套路,這一文足以?

    大家好,我是安然無虞。 目錄 一、刷題前和鐵汁們嘮一嘮 1.刷題前須知 2.刷題時套路 1套路 2背下列常用數(shù) ? 3投機(jī)取巧:根據(jù)數(shù)據(jù)范圍確定算法 ? 4珍惜每分每秒 · 直接復(fù)制粘貼? 5輸入輸出函數(shù)的使用 二、刷題強(qiáng)化 例一:遞歸實(shí)現(xiàn)指數(shù)型枚舉 例二:遞歸實(shí)現(xiàn)排列型枚舉

    2023年04月10日
    瀏覽(33)
  • 藍(lán)橋杯每日一題----單調(diào)棧和單調(diào)隊列

    藍(lán)橋杯每日一題----單調(diào)棧和單調(diào)隊列

    單調(diào)棧即棧內(nèi)的元素是單調(diào)遞減或者單調(diào)遞增的,我們通過一個題目來理解。 單調(diào)棧模板題 題目描述 給出項(xiàng)數(shù)為 n 的整數(shù)數(shù)列 a 1 … a n a_1…a_n a 1 ? … a n ? 。 定義函數(shù) f ( i ) f(i) f ( i ) 代表數(shù)列中第 i 個元素之后第一個大于 a i a_i a i ? 的元素的下標(biāo),即 f ( i ) = m i n i

    2024年02月19日
    瀏覽(31)
  • 單調(diào)隊列-滑動窗口最大值

    Problem: 239. 滑動窗口最大值 輸入一個數(shù)組nums,滑動窗口k遍歷該數(shù)組,輸出得到的最大值數(shù)組; 示例1: 輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3 輸出:[3,3,5,5,6,7] 構(gòu)造一個單調(diào)隊列表示當(dāng)前窗口中單調(diào)遞減的隊列,隊列的頭就是最大值,為保證這個隊列是窗口數(shù)據(jù)的表示,每次判斷隊

    2024年02月22日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包