左神算法进阶班3_2求最大矩阵 逃离我推掉我的手 2022-01-05 23:55 133阅读 0赞 **【题目】** 给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1 的所有矩形区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0 其中,最大的矩形区域有3个1,所以返回3。 再如: 1 0 1 1 1 1 1 1 1 1 1 0 其中,最大的矩形区域有6个1,所以返回6。 **【解】** 使用单调栈 栈序为从小到大顺序。 将矩阵从第一行向下将每一行进行累加,新的行中为0则其累加和为0 利用单调栈进行计算出每一行的累加和的最大矩阵 如上例的第一行累加和数组为\[1,0,1,1\] 第二行累加和数组为\[2,1,2,2\] 第三行累加和数组为\[3, 2, 3, 0\]; **【Code】** ** ** 1 #pragma once 2 #include <iostream> 3 #include <vector> 4 #include <deque> 5 6 using namespace std; 7 8 int MaxRecArea(const vector<vector<int>>v) 9 { 10 vector<int>Sum(v[0].size(),0);//储存每行的累加和 11 int res = 0; 12 for (int i = 0; i < v.size(); ++i) 13 { 14 for (int j = 0; j < v[0].size(); ++j) 15 Sum[j] = v[i][j] == 0 ? 0 : (Sum[j] + v[i][j]); 16 17 deque<int>d;//单调栈 18 for (int j = 0; j < Sum.size(); ++j) 19 { 20 while (!d.empty() && Sum[j] <= Sum[d.back()])//维持栈为从小到大的排序 21 { 22 int index = d.back(); 23 d.pop_back(); 24 if (d.empty())//弹出的数能到最左边-1的位置 25 res = res > (Sum[index] * j) ? res : (Sum[index] * j); 26 else//弹出的数有左边界 27 res = res > (Sum[index] * (j - d.back() - 1)) ? res : (Sum[index] * (j - d.back() - 1)); 28 } 29 d.push_back(j); 30 } 31 while (!d.empty())//弹出剩余的数,其都无右边界,右边界为数组的大小 32 { 33 int index = d.back(); 34 d.pop_back(); 35 if (d.empty())//弹出的数能到最左边-1的位置 36 res = res > (Sum[index] * Sum.size()) ? res : (Sum[index] * Sum.size()); 37 else//弹出的数有左边界, 38 res = res > (Sum[index] * (Sum.size() - d.back() - 1)) ? res : (Sum[index] * (Sum.size() - d.back() - 1)); 39 } 40 } 41 return res; 42 } 43 44 45 46 void Test() 47 { 48 vector<vector<int>>v; 49 v = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 0, 1, 1 }, }; 50 cout << MaxRecArea(v) << endl; 51 52 } 转载于:https://www.cnblogs.com/zzw1024/p/11052496.html
相关 左神算法进阶班3_4网易题——烽火传递 【题目】 一个数组中的数字组成环形山,数值为山高 1 2 4 5 3 规则,烽火传递: 相邻之间的两座山必能看到烽火, 非相邻的山之间有一边的山高都 <= Bertha 。/ 2022年10月02日 15:55/ 0 赞/ 119 阅读
相关 左神算法进阶班3_1构造数组的MaxTree 题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在 缺乏、安全感/ 2022年10月02日 15:55/ 0 赞/ 94 阅读
相关 左神算法:加强堆的实现(Java) 为什么要有加强堆? Java中的PriorityQueue(优先级队列)就是系统提供的堆实现,那么为什么还要手动去实现? 假如现在你手里有一个堆,里面存着一些元素,用户 小鱼儿/ 2022年09月06日 00:18/ 0 赞/ 132 阅读
相关 求矩阵最大两个数 input 接下来的四行每行包括五个整数。 代表一个四行五列的矩阵,矩阵元素全部是整数。 output 可能有多组测试数据,对于每组数 左手的ㄟ右手/ 2022年06月01日 10:38/ 0 赞/ 224 阅读
相关 【搞定左神算法初级班】第7节:暴力递归、动态规划 目 录: 一、递归 题目1:求 n! 的结果 题目2:汉诺塔问题 题目3:打印一个字符串的全部子序列,包括空字符串 题目4:打印一个字符串的全部排列 题目5:母 冷不防/ 2022年04月23日 15:20/ 0 赞/ 244 阅读
相关 【搞定左神算法初级班】第3节:栈、队列、链表、矩阵结构及相关常见面试题 目 录: 一、栈 题目1:用固定的大小的数组实现栈和队列 题目2:能返回栈中最小元素的栈 题目3:如何仅用队列结构实现栈结构? 二、队列 题目1:如何仅用栈结 淡淡的烟草味﹌/ 2022年02月28日 12:48/ 0 赞/ 120 阅读
相关 【搞定左神算法初级班】第6节:前缀树、贪心算法 目 录: 一、前缀树:Prefix Tree 1.1 前缀树题目举例:一个字符串类型的数组 arr1,另一个字符串类型的数组 arr2 1.2 前缀树的 insert 以你之姓@/ 2022年02月26日 13:20/ 0 赞/ 187 阅读
相关 左神算法进阶班1_4Manacher算法 1 include <iostream> 2 include <string> 3 4 using namespace std; 朴灿烈づ我的快乐病毒、/ 2022年01月06日 00:01/ 0 赞/ 166 阅读
相关 左神算法进阶班3_2求最大矩阵 【题目】 给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1 的所有矩形区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0 逃离我推掉我的手/ 2022年01月05日 23:55/ 0 赞/ 134 阅读
还没有评论,来说两句吧...