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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找)

發(fā)布時間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 題目

給定一個非空二維矩陣 matrix 和一個整數(shù) k,找到這個矩陣內(nèi)部不大于 k 的最大矩形和。

示例: 輸入: matrix = [[1,0,1],[0,-2,3]], k = 2 輸出: 2 解釋: 矩形區(qū)域 [[0, 1], [-2, 3]] 的數(shù)值和是 2, 且 2 是不超過 k 的最大數(shù)字(k = 2)。說明: 矩陣內(nèi)的矩形區(qū)域面積必須大于 0。 如果行數(shù)遠大于列數(shù),你將如何解答呢?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

最好在做本題之前,先把下面鏈接題目讀懂

程序員面試金典 - 面試題 17.24. 最大子矩陣(轉(zhuǎn)成一維最大子序和 DP)

  • 本題說行比較多,那么按列來壓扁,兩重循環(huán),遍歷所有的列組合
  • 對每種列組合,壓扁后的 m (行數(shù))個和,先求最大子序和(按照上題方法)
  • 如果最大連續(xù)子序和 == k,返回 k,< k 進行下一個組合
  • 如果子序和 > k ,那還需要找是否有 <= k 的呢?將前綴和 prefix 插入set(初始有0,防止prefix 一開始就是 k 的情況)
  • 二分查找 prefix-k 的下限 lb,如果存在,則lb >= prefix-k, 兩個前綴和做差就是連續(xù)子序列的和 SUM = prefix - lb <= k,更新最大值
class Solution { public:int maxSumSubmatrix(vector<vector<int>>& mat, int k) {if(mat.empty() || mat[0].empty())return 0;int m = mat.size(), n = mat[0].size(), i, j1, j2;int sum, tempmax, maxsum = INT_MIN, prefix;vector<int> sumCols(m);for(j1 = 0; j1 < n; ++j1){sumCols.clear();sumCols.resize(m);for(j2 = j1; j2 < n; ++j2){ //列的左右邊界組合for(i = 0; i < m; ++i)sumCols[i] += mat[i][j2];//行向求和sum = tempmax = INT_MIN; for(i = 0; i < m; ++i){ //對上面的和,求最大連續(xù)子序列和,DPif(sum > 0)sum += sumCols[i];elsesum = sumCols[i];tempmax = max(sum, tempmax);//臨時的最大子序列和if(sum <= k)//更新答案maxsum = max(maxsum, sum);}if(tempmax == k || maxsum==k)return k;//找到上限直接返回if(tempmax < k)//最大連續(xù)子序列和小于 k,進行下一輪continue;//最大連續(xù)子序列和 大于 k,還要繼續(xù)查找 有可能 <= k 的set<int> s;s.insert(0);//第一個就是k的時候,可以找到prefix = 0;//利用前綴和,在set中二分查找for(i = 0; i < m; ++i){prefix += sumCols[i];auto it = s.lower_bound(prefix-k);s.insert(prefix);if(it != s.end()){int SUM = prefix-(*it);if(SUM > maxsum)maxsum = SUM;}if(maxsum == k)return k;}}}return maxsum;} };

60 ms 9.3 MB

總結(jié)

以上是生活随笔為你收集整理的LeetCode 363. 矩形区域不超过 K 的最大数值和(DP+set二分查找)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。