第四章:多維陣列和矩陣 ------------- 4.8 子矩陣的最大累加和
題目:
給定一個矩陣matrix,其中的值有正、有負、有0,返回子矩陣的最大累加和。
例如,matrix為:
-1 -1 -1
-1 2 2
-1 -1 -1
其中最大累加的子矩陣為:2 2,所以返回 4
思路:
解法一:暴力破解,查詢出所有的子矩陣,時間複雜度太高了,不可取。
解法二:假定只有一行,那就跟求最大和子陣列一樣。
如果限定兩行,可以把兩行按列求和,
同上所有我們從把第一行當做起點,依次累加後面的每一行後,都求一個最大子陣列和 。
以第二行作為起點,依次累加後面的每一行後,都求一個最大子陣列和 每次求出來的和與歷史最大值比較,如果更大,則更新 。
Arrays.fill(arr, 0);//快速地將arr的每個元素都設定為0。
程式碼:
import java.util.Arrays;
public class MaxSubMatrix {
static int maxSum(int [][]matrix){
int beginRow = 0;// 以它為起始行
final int M = matrix.length;
final int N = matrix[0].length;
int []sums = new int[N]; // 按列求和
int max = 0; // 歷史最大的子矩陣和
while(beginRow<M){
for (int i = beginRow; i < M; i++) {
// 按列累加
for (int j = 0; j < N; j++) {
sums[j] += matrix[i][j];
}
// 累加完成,呼叫上一篇部落格求最大子陣列累加和的方法
int t = MaxSubArray.findByDp(sums);
if (t>max) {
max = t;
}
}
//另起一行,作為起始行,sums 清零
Arrays.fill(sums, 0); // 快速地將sums的每個元素都設定為0
beginRow++;
}
return max;
}
public static void main(String[] args) {
int[][] matrix = {
{-90, 48, 78},
{64, -40, 64},
{-81, -7, 66}
};
matrix = new int[][]{{1, 2, -1}};
int res = maxSum(matrix);
System.out.println(res);
}
}
結果:
相關文章
- 第四章:多維陣列和矩陣 ------------- 4.7 子陣列最大累加和陣列矩陣
- 第四章:多維陣列和矩陣 ------------- 4.4 找出邊界為1的最大子方陣陣列矩陣
- 矩陣和陣列矩陣陣列
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- 第四章:多維陣列和矩陣 --------------- 4.1 基礎題:順時針列印二維陣列陣列矩陣
- 第四章:多維陣列和矩陣 ------------- 4.3 基礎題:Z形列印二位陣列陣列矩陣
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 第四章:多維陣列和矩陣 ----------- 4.2 基礎題:將0所在的行列清零陣列矩陣
- 巨大的矩陣(矩陣加速)矩陣
- 240. 搜尋二維矩陣 II 和74. 搜尋二維矩陣矩陣
- 伴隨矩陣和逆矩陣的關係證明矩陣
- 求二維陣列中最大子陣列的和陣列
- #1502 : 最大子矩陣矩陣
- 鄰接矩陣、度矩陣矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- 演算法-陣列與矩陣演算法陣列矩陣
- 求任意矩陣的伴隨矩陣矩陣
- 矩陣的最短距離和矩陣
- 矩陣矩陣
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- 最大連續子陣列和(最大子段和)陣列
- 矩陣的特徵值和特徵向量矩陣特徵
- 977.有序陣列的平方 ,209.長度最小的子陣列 ,59.螺旋矩陣II陣列矩陣
- 陣列累加和問題三連陣列
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- 最大連續子陣列和的實現陣列
- 子陣列的最大異或和問題陣列
- C++ 練氣期之二維陣列與矩陣運算C++陣列矩陣
- 理解矩陣矩陣
- 海浪矩陣矩陣
- 矩陣相乘矩陣
- 稀疏矩陣矩陣
- 螺旋矩陣矩陣
- 矩陣乘法矩陣
- 8.6 矩陣?矩陣
- 找矩陣矩陣
- 矩陣分解矩陣