來自牛客網左程雲第三課第二題
問題:給定乙個無序矩陣,其中有正,有負,有 0,再給定乙個值 k,求累加和小於等於 k 的最大子矩陣大小,矩陣的大小用其中的元素個數來表示。
分析:這個問題也是乙個子矩陣問題,參看求子矩陣的最大和的分析,我們同樣可以將其轉換成子陣列問題。本題的演算法原型是未排序陣列中累加和小於或等於給定值的最長子陣列長度。
解法:我們求出以每一行的為首行的子矩陣的列累加和,就是將列對應相加,這樣我們就得到了乙個陣列,接下來我們求這個陣列中累加和小於或等於給定值的最長子陣列,也就是求出了這個當前符合題意得最大子矩陣。那麼我們一共有n行,以這些行為首行的子矩陣有n*n個,求陣列中累加和小於或等於給定值的最長子陣列長度的時間複雜度為o(n*logn),整體的時間複雜度為o(n^3*logn)。演算法原型真的是很重要啊。
public class main
int res = integer.min_value;
for (int i = 0; i < m.length; i++)
}res = math.max(maxlength(m[i], sum) * (j - i + 1), res);
}} return res;
} public static int maxlength(int arr, int k)
sum = 0;
int max = integer.min_value;
int len = integer.min_value;
int res = -1;
for (int i = 0; i < arr.length; i++)
return max;
} public static int getlessindex(int arr, int num) else
} return res;
} public static void main(string args) , };
system.out.println(maxsubmatrixsumlessthank(matrix, 2));
}}
求矩陣的最大子矩陣面積
問題引入 求解直方圖中最大的矩形面積 核心思想 讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 主函式,讓二維陣列轉換成多層的一維陣列,再根據一維陣列構建直方圖 public intmaxrecsize int map int maxarea 0 int height newint map...
求最大子矩陣的大小
給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大矩形區域為1的數量。時間複雜度達到o mn 具體思路請參考原書 include include include using namespace std intmaxrecfrombottom int height,in...
求最大子矩陣的大小
題目 給定乙個整型矩陣map,其中的值只有0和1兩種,求其中全是1的所有矩陣區域中,最大的矩形區域為1的數量。思路 步驟1 矩陣的行數為n,以每一行做切割,統計以當前行作為底的情況下,每個位置往上的1的數量。使用高度陣列height來表示。例如 map 1 0 1 1 1 1 1 1 1 1 1 0...