左神的书——《程序员代码面试指南》之最大01子矩阵的大小 c++实现
来源:互联网 发布:软件项目管理案例 编辑:程序博客网 时间:2024/05/14 05:30
//题目:
//给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。
// 1 0 1 1
// 1 1 1 1
// 1 1 1 0
//给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。
// 1 0 1 1
// 1 1 1 1
// 1 1 1 0
//其中,最大的矩形区域有6个1,所以返回6。
//思路:以每一行做切割,统计以当前行作为底的情况下,每个位置往上的连续1的数量,使用高度数组height来表示。
//以第一行切割后,height = { 1,0,1,1}.
//以第二行切割后,height = { 2,1,2,2}.
//以第三行切割后,heigth = { 3,2,3,0}.
//我们用一个栈来存储height数组的下标,当栈为空的时候或当前元素的值大于栈顶元素(height[s.top())的值,直接压入栈。
//当栈不为空,且当前元素的值小于或等于栈顶元素时,结算以当前元素的下标为右边界,以栈顶元素下面的那个值为左边界。高度就是当前元素,求得这个矩阵的大小。
//后弹出栈顶元素,重复操作,直到当前元素大于栈顶元素或栈为空,压入当前元素。
#include<iostream>using namespace std ;#include <cassert>#include <stack>int maxRecFromBotton(int *height, int size){assert(height && size > 0);int max = 0;stack<int> s;for (int i = 0; i < size; ++i) //遍历这个数组{while (!s.empty() && height[i] <= height[s.top()]) //等于栈顶元素的时候也要结算。{int j = s.top();s.pop();int k = s.empty() ? -1 : s.top(); //当栈为空时,左边界为-1,否则为栈顶下面那个值,右边界等于当前元素的下标。int cur = height[j] * (i-k-1); //矩阵的宽度为(i-k-1).因为左边界和右边界都是不可访问的,如左边界为-1,右边界为3,宽度就是【0,1,2】 等于3.max = cur > max ? cur : max;}s.push(i); //当前元素大于栈顶元素时,直接push}//当数组遍历完了,别忘了栈中可能还有元素,while (!s.empty()){int j = s.top();s.pop();int k = s.empty() ? -1 : s.top(); //左边界。int cur = height[j] * (size-k-1); //当数组遍历完了右边界为数组大小。max = cur > max ? cur : max; }return max;}int maxRecSize(int map[][4],int row){assert(map && row > 0);int col = 4;int max = 0;int *height = new int[col]; memset(height,0,sizeof(height)*col);for (int i = 0; i < row; ++i){for (int j = 0; j < col; ++j){height[j] = map[i][j] == 0 ? 0 :height[j]+1; //数组的元素表示为以当前行为底,连续1的数量。}int cur = maxRecFromBotton(height,col);max = cur > max ? cur : max;}return max;}int main(){int map[3][4] = {{1,0,1,1},{1,1,1,1},{1,1,1,0}};int res = maxRecSize(map, 3);cout << res <<endl;cout << "hello..." <<endl;system("pause");return 0;}
0 0
- 左神的书——《程序员代码面试指南》之最大01子矩阵的大小 c++实现
- 左神的书——《程序员代码面试指南》之逆置单链表或双链表 c++实现
- 左神的书——《程序员代码面试指南》之最大值减去最小值小于或等于num的子数组的数量 c++实现
- 左神的书——《程序员代码面试指南》之设计一个有getmin功能的栈 c++实现
- 左神的书——《程序员代码面试指南》之逆置单链表的部分节点 c++实现
- 左神的书——《程序员代码面试指南》之生成窗口最大值数组问题c++实现
- 左神的书——《程序员代码面试指南》之用一个栈实现另一个栈的排序c++实现
- 左神的书——《程序员代码面试指南》之打印两个有序链表的公共部分 c++实现
- 左神的书——《程序员代码面试指南》之删除链表的倒数第k个节点 c++实现
- 左神的书——《程序员代码面试指南》之删除链表的中间节点或a/b节点 c++实现
- 求最大子矩阵的大小——C++实现
- 求最大子矩阵的大小 + 栈
- 求最大子矩阵的大小
- 求最大子矩阵的大小
- 程序员面试金典——解题总结: 9.18高难度题 18.12给定一个正整数和负整数组成的N*M矩阵,编写代码找出元素总和最大的子矩阵。
- 最大子矩阵(限制矩阵的大小)
- 最大子矩阵—最大子段和的推广
- 栈和队列——求最大子矩阵的大小
- 【分享】Office2016安装包下载 安装 激活
- 自己对流程控制语句的一些理解和总结
- 表ADT
- Gradle Dependencies Helper插件
- 交叉验证(Cross-validation)
- 左神的书——《程序员代码面试指南》之最大01子矩阵的大小 c++实现
- 程序员面试金典: 9.4树与图 4.8判断一棵树是否是另一棵树的子树
- Pattern Recognition and Machine Learning 第三章 线性回归模型
- C++学习笔记之类基础
- linux时间子系统 - 动态任务
- 如何给网页标题添加icon小图标
- python编程(python开发的三种运行模式)
- 左神的书——《程序员代码面试指南》之最大值减去最小值小于或等于num的子数组的数量 c++实现
- 【LeetCode】Fizz Buzz 解题报告