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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 363. Max Sum of Rectangle No Larger Than K | 363. 矩形区域不超过 K 的最大数值和(前缀和,图文详解)

發布時間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 363. Max Sum of Rectangle No Larger Than K | 363. 矩形区域不超过 K 的最大数值和(前缀和,图文详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/

題解

本題利用 前綴和 的思想。

首先,分別建立橫向、縱向輔助數組 rowSum[][], colSum[][]。其中:

  • 橫向輔助數組 看作是一維的,每行的 rowSum[i] 第表示的是從 0 到 i 的累加和;

  • 縱向輔助數組 看作是二維的,每列均由 rowSum 縱向遍歷相加所得,colSum[i][j] 表示的是從 [0,0] 位置[i,j] 位置 的矩陣的累加和,表示面積。

然后,根據容斥原理:

便可以得到如下圖所示的思路。


直接上代碼:

class Solution {public int maxSumSubmatrix(int[][] matrix, int k) {int M = matrix.length;int N = matrix[0].length;// 橫向累加和int[][] rowSum = new int[M][N + 1];for (int i = 0; i < M; i++) {rowSum[i][0] = 0;for (int j = 1; j < N + 1; j++) {rowSum[i][j] = rowSum[i][j - 1] + matrix[i][j - 1];}}// 縱向累加和(面積)int[][] colSum = new int[M + 1][N + 1]; // 第1行 第1列 均為0for (int i = 0; i < N + 1; i++) {colSum[0][i] = 0;for (int j = 1; j < M + 1; j++) {colSum[j][i] = colSum[j - 1][i] + rowSum[j - 1][i];}}// 容斥原理int result = Integer.MIN_VALUE;for (int x1 = 1; x1 < M + 1; x1++) {for (int y1 = 1; y1 < N + 1; y1++) {for (int x2 = x1; x2 < M + 1; x2++) {for (int y2 = y1; y2 < N + 1; y2++) {int s = colSum[x2][y2] - colSum[x1 - 1][y2] - colSum[x2][y1 - 1] + colSum[x1 - 1][y1 - 1];if (s == k) return k;else if (s < k) result = Math.max(result, s);}}}}return result;} }

總結

以上是生活随笔為你收集整理的leetcode 363. Max Sum of Rectangle No Larger Than K | 363. 矩形区域不超过 K 的最大数值和(前缀和,图文详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。