[POJ 2559] | Eurce's Blog



题意:输入n(<=100,000),然后是n个整数值h[i](<=10^9),每个值按顺序描述了一个宽为1高为h[i]的矩形,矩形间是无缝相邻的,求该柱形图内边与坐标轴平行的矩形的最大面积。

拿到手之后第一想法是二分面积+RMQ判断,结果发现行不通…… 看了discuss可以用栈水过,就大概写了一下。

基本思想是,对于位置i,分别找其左边和右边高度不小于h[i]的最长宽度wl[i]和wr[i],那么h[i]对应的最大矩形面积就是h[i]*(wl[i]+wr[i]-1)。分别求出对于所有n个位置的最大矩形面积就能得到答案了。

具体实现方面,计算wl[i]和wr[i]时,需要维护一个栈stk,记录扫描到i时,到i为止非递减的h[i]序列。例如对于"7 2 1 4 5 1 3 3"的样例,当i=3即h[i]=5时,栈里面分别是1、4、5,同时也需要记录这些值对应的位置。有了该栈,就可以找到刚好不小于h[i]的值stk[l]以及对应的位置si[l],从而算出wl[i]、wr[i]。其中,由于栈有序,可以二分查找,那么计算wl[i]和wr[i]的时间复杂度便是O(lgn),从而总体复杂度就是O(nlgn)的。

还有一些细节:例如总是将栈顶置为最大值,这样二分查找如果失败将返回栈顶位置,方便了处理;另外结果需要用到long long。


Read full article from [POJ 2559] | Eurce's Blog


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts