leetcode_084 Largest Rectangle in Histogram
2016-04-07 23:10
375 查看
题目分析:
求条形图中最大矩形的面积,输入为条形图中条的个数和每个条的高度。
解题思路:
双重循环(超时)
找第i个条左边和右边连续的不低于条的个数,然会计算面积,从而得最后结果
利用栈的思想求解
计算第i个条件图对应的矩形面积,需要知道它连续的左边有多少个条的高度不低于它,假设有a个;同时需要知道它右边多少个连续的条的高度不低于它,假设有b个,此时第i条对应的最大矩形面积为 hi * (a + b + 1)。
实现程序
求条形图中最大矩形的面积,输入为条形图中条的个数和每个条的高度。
解题思路:
双重循环(超时)
找第i个条左边和右边连续的不低于条的个数,然会计算面积,从而得最后结果
利用栈的思想求解
计算第i个条件图对应的矩形面积,需要知道它连续的左边有多少个条的高度不低于它,假设有a个;同时需要知道它右边多少个连续的条的高度不低于它,假设有b个,此时第i条对应的最大矩形面积为 hi * (a + b + 1)。
实现程序
class Solution { public: //方法1:双重循环进行求解(超时) int largestRectangleArea1(vector<int> &height) { int max_area = 0; for (int i = 0; i < height.size(); i++) { int t = height[i]; int j = i - 1; int k = i + 1; int temp_area = height[i]; // 找前面连续的不低于height[i]的位置 while (j >= 0) { if (height[j] >= height[i]) { temp_area += height[i]; j--; } else break; } // 找后面连续的不低于height[i]的位置 while (k <= height.size() - 1) { if (height[k] >= height[i]) { temp_area += height[i]; k++; } else break; } if (max_area < temp_area) { max_area = temp_area; } } return max_area; } // 计算最大值函数 int Max(int a, int b) { return a > b ? a : b; } // 方法2:利用栈进行求解 int largestRectangleArea(vector<int> &height) { height.push_back(0); // 记录当前第i位置对应连续不低于height[i]的最前位置 stack<int> stack; int i = 0; int maxArea = 0; while (i < height.size()) { // 当栈为空,或栈中元素位置的高度低于当前高度,更行第i位置对应的前面连续不低于height[i]的位置,不进行计算面积 // 只要连续递增,就一直进栈 if (stack.empty() || height[stack.top()] <= height[i]) { // 次数当前位置进栈,同时i移动位置 stack.push(i++); } else // 计算面积 { int t = stack.top(); // 取出栈顶元素 stack.pop(); // 计算面积,并更新最大面积 maxArea = Max(maxArea, height[t] * (stack.empty() ? i : i - stack.top() - 1)); } } return maxArea; } };
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解