给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
2017-01-13 15:22
381 查看
给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
#include <iostream> #include <stack> using namespace std; typedef struct Node { int w; int h; } Node; /* 矩形结构 */ stack<Node*> mystack; Node** initNodeArr(int *arr, int len) { Node** nodeArr = new Node*[len]; for (int i = 0; i < len; ++i) { Node * node = new Node(); node->w = 1; node->h = arr[i]; nodeArr[i] = node; } return nodeArr; } int findMaxRectangleArea(int *arr, int len) { if (!arr) { return 0; } Node** nodeArr = initNodeArr(arr, len); int curArea = 0; int maxArea = 0; int totalWidth = 0; for (int i = 0; i < len; ++i) { if (mystack.empty()) { mystack.push(nodeArr[i]); } else { //栈内元素高度非线性递增 if (mystack.top()->h <= nodeArr[i]->h) { mystack.push(nodeArr[i]); } else { /*当插入元素小于栈顶, 需要整合,将大于插入元素高的元素出栈, * 并以插入元素高度为准,宽度为出栈个数+插入元素宽度, * 整合为新矩形*/ totalWidth = 0; while (!mystack.empty()) { if (mystack.top()->h > nodeArr[i]->h) { totalWidth += mystack.top()->w; mystack.pop(); } else { break; } } totalWidth += nodeArr[i]->w; nodeArr[i]->w = totalWidth; mystack.push(nodeArr[i]); } } } //计算最大面积 totalWidth = 0; while (!mystack.empty()) { totalWidth += mystack.top()->w; if ((curArea = totalWidth * mystack.top()->h) > maxArea) { maxArea = curArea; } mystack.pop(); } return maxArea; } int main() { int arr[] = { 5, 4, 3, 2, 4, 5, 0, 7, 8, 4, 6 }; cout << "maxArea: " << findMaxRectangleArea(arr, sizeof(arr) / sizeof(arr[0])); return 0; }
相关文章推荐
- 给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 【1】 设一个长度为10的整型数组,  0)要求每个元素的值通过scanf输入,输入完成后,  1)请顺序输出这些整数,  2)请倒序输出这些整数,  3)输出这些数中的最大值,最小值
- 给定一个非负整数数组,最初定位在数组的第一个索引处。组中的每个元素表示您在该位置的最大跳跃长度。求最小跳数
- 设一个长度为10的整型数组, 0)要求每个元素的值通过scanf输入,输入完成后, 1)请顺序输出这些整数, 2)请倒序输出这些整数, 3)输出这些数中的最大值, 4)输出这些数中的最小值
- 【题目】:输入一个非负整形数组,其中每个数代表紧挨着的宽为1的墙的高度,输出这些墙之间能积水的体积。函数接口为 int Volume(int * height,int n),要求只能遍历一 遍数组,且
- 面试题精选(85):给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 一个整型数组中,每个元素两两出现,其中一个元素只出现一次,请找出来
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 有20个数组,每个数组有500个元素,升序排列,现在在这20*500个数中找出排名前500的数。求时间复杂度?
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 给定一个乱序数组,找到其中第K大的值,要求时间复杂度最低
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 实现一个栈,获取其中最大元素,获取时间复杂度为O(1)
- 给定一个含有n个元素的整型数组a,求a中的最大值和最小值。
- 求一个整型数组的最大和的子数列,要求时间复杂度为线性的