給定乙個正整數、負整數和 0 組成的 n × m 矩陣,編寫**找出元素總和最大的子矩陣。
返回乙個陣列 [r1, c1, r2, c2],其中 r1, c1 分別代表子矩陣左上角的行號和列號,r2, c2 分別代表右下角的行號和列號。若有多個滿足條件的子矩陣,返回任意乙個均可。
輸入:[
[-1,0],
[0,-1]
]輸出:[0,1,0,1]
解釋:最大的和是0 答案可以是0 1 0 1或者1 0 1 0
說明:1 <= matrix.length, matrix[0].length <= 200
列舉矩陣的兩個座標 (x1,y1) (x2,y2),也就是4層for迴圈。
利用二維字首和陣列可以在已知兩個座標的前提下o(1)求出和,所以總的複雜度是o(n^4)。
**:
class solution }}
}}return a;}};
求二維字首和矩陣sum時的狀態轉移方程是:sum[i][j]=matrix[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
已知兩個座標 (x1,y1) (x2,y2),求其矩陣和t時:t=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
這其中有-1的存在,所以當x1,y1,x2,y2是從0列舉時會執行時錯誤,需要單獨拿出來判斷下。
最終寫成的**比較好理解,但是有點兒繁瑣,而且超時是一定的。
一維的最大子串行和我們都很熟悉,不管是用動態規劃還是貪心,都能在o(n) 的時間複雜度內,求出最大連續子串行的和。
不了解的可以看:三種解法求:最大連續子串行的和
假設我們固定了矩陣的上邊和下邊,再把其中每一列的數看做乙個整體(因為選就要全選,或者全不選,本身也是乙個整體),這樣二維的矩陣和就變成了一維的最大子串行和。
陣列b的作用是在矩陣的上下邊確定的時候,也就是i,j確定的時候,求出包含在中間的每一列的總和。
然後再用這些總和,也就是b陣列直接求最大子串行。
其中,因為矩陣的上邊界 i 確定之後,然後下邊界遞增,所以這個矩陣每列的和只需要加上新加的那一行的元素就可以了。
在每次上邊界 i 改變的時候,再清空 b,重新計算。
時間複雜度:o(n^3)
正解的二維轉一維,**含金量更高,但是寫起來確實比暴力要簡潔。
最大子段和 最大子矩陣和
給出n個整數序列 可能為負數 組成的序列a1,a2,an,求該序列形如 的子段和的最大值。當所有整數均為負數時,定義最大子段和為0。多測試用例。每個測試用例佔2行 第一行是序列的個數n 0 n 10000 第二行是n個整數。為每個測試用例輸出一行結果 最大子段和。6 2 11 4 13 5 2 31...
最大子矩陣和
前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...
最大子矩陣和
前言 今天花了很長時間,看了無數人寫的帖子,但是幾乎沒有人把這個問題一下子說得很清楚,所以,我把這個問題按照自己的思路寫出來,希望能夠把這個問題講清楚。問題 求乙個m n的矩陣的最大子矩陣和。比如在如下這個矩陣中 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 擁有最大和的子矩陣為 ...