【左神算法课】二维矩阵的子矩阵最大累加和

题目描述:

思路描述(请结合后面的程序配套理解):

代码:

 1 /*
 2 本程序说明:
 3
 4 给定一个矩阵matrix,其中有正有负有0,返回子矩阵的最大累加和
 5 例如矩阵matrix为:
 6 -90 48 78
 7 64 -40 64
 8 -81 -7 66
 9 其中最大累加和的子矩阵为
10 48 78
11 -40 64
12 -7 66
13
14 */
15 #include <iostream>
16 #include <vector>
17 using namespace std;
18
19 int SubMatrixMaxSum(const vector<vector<int> >& matrix)
20 {
21     int max_sum=0;
22     for(size_t i=0;i<matrix.size();++i)
23     {
24         vector<int> s(matrix[0].size());
25         for(size_t j=i;j<matrix[0].size();++j)
26         {
27             int sum_cur=0;
28             for(size_t k=0;k<matrix[0].size();++k)
29             {
30                 s[k]+=matrix[j][k];
31                 sum_cur+=s[k];
32                 sum_cur=sum_cur<0 ? 0 : sum_cur;
33                 max_sum=max(max_sum,sum_cur);
34             }
35         }
36     }
37     return max_sum;
38 }
39
40 int main()
41 {
42     vector<vector<int> > matrix{{-90,48,78},{64,-40,64},{-81,-7,66}};43     cout<<SubMatrixMaxSum(matrix)<<endl;
44     return 0;
45 }
时间: 2024-08-12 16:09:22

【左神算法课】二维矩阵的子矩阵最大累加和的相关文章

【左神算法课】子数组最大差值小于某阈值,求满足条件的子数组个数

题目描述: 解法思路: 本题其实是滑动窗口的变形.主体思路为: 1.从第一个元素开始依次向后遍历,同时维护两个窗口(由于要同时操作窗口的头部和尾部,故采用双端队列): 最大值窗口(递减),头部永远存最大值 最小值窗口(递增),头部永远存最小值 2.比较两个窗口的头部元素差值,若差值大于阈值,即可跳出内循环. 3.跳出内循环后,检查头部元素是否过期,若过期,则清除. 复杂度: 时间复杂度:O(n),注意虽然是两层循环,但元素只从滑动窗口尾部进,从头部清除,只是顺序扫描了一遍. 空间复杂度:O(n)

第三十二课 二维数组及其定义 【项目1-2】

第三十二课  二维数组及其定义 项目一 [折腾二维数组] 创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值: 按行序优先输出数组元素: 将所有元素值乘以3后保存在数组中: 按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"转置"): 将数组"倒"着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出): 输出数组中的所有偶数: 输出所有行列下标之和为3的倍数的元素值

力扣240——搜索二维矩阵

这道题主要是利用搜索二维矩阵本身的特性,找到其中的规律,就可以解决了. 原题 编写一个高效的算法来搜索?m?x?n?矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定

lintcode 容易题:Search a 2D Matrix 搜索二维矩阵

题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解题: 1.最简单的方法就是遍历整个矩阵,时间复杂度:O(log(mn)),这个应该等于O(long(

lintcode 中等题:search a 2d matrix II 搜索二维矩阵II

题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 考虑下列矩阵: [     [1, 3, 5, 7],     [2, 4, 7, 8],     [3, 5, 9, 10] ] 给出target = 3,返回 2 挑战 要求O(m+n) 时间复杂度和O(1) 额外空间 解题 直接遍历,时间复杂度是O(MN) public

关于有序二维矩阵查找和字符串替换的两道算法题

最近看一本书上写到的两个面试题 于是实现了一下 感觉思路很好,大牛略过 : 1.对于一个二维矩阵,从左到右  从上到下 都是递增的,如何判断一个值是否在矩阵内部?(C实现  实现复杂度 O(n)) bool FindInTwoDimensionalMatrix(int*pMatrix,int iRows,int iCols,int iFindVal) { bool bFind=false ; if(pMatrix==0||iRows<=0||iCols<=0) return bFind ; i

[LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted in ascending from left to right. Integers in each column are sorted in ascending from top to bottom.

lintcode 搜索二维矩阵

题目:搜索二维矩阵 描述: 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true ------------------------------------------- 开始用两个二分搜索,先找列,再找行.运行后提示超时... 1 c

搜索二维矩阵II

题目 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 解题 和判断一个数是否在这样的二维矩阵中一样,判断找到适合就结束了 这个题目有多个,找到一个的时候还要继续找,直到找完 public class Solution { /** * @param matrix: A list of lists of integers * @param: A number