image
主要的知識(shí)點(diǎn)是:?jiǎn)握{(diào)棧,該題牢牢記得:棧中記錄當(dāng)前樓能看到的元素
image
單調(diào)棧是單調(diào)遞增棧墙贱,棧頂是最小值
單調(diào)棧存的是能看到的樓
向左看:
從0開(kāi)始遍歷元素
首先取leftstack的大小作為向左看的值
分情況討論:
(1)如果leftstack為empty(),則:
```
leftstack.push(heights[i]);
```
(2)如果leftstack不為empty()伊脓,且當(dāng)前樓小于棧中最小元素,表明當(dāng)前樓可以被下一層樓看到报腔,入棧:
```
leftstack.push(heights[i]);
```
(3)如果leftstack不為empty(),且當(dāng)前樓大于于棧中最小元素邪狞,代表當(dāng)前樓把棧頂元素遮住了茅撞,看不到棧頂元素米丘,所以將棧頂彈出拄查,繼續(xù)比較,直到當(dāng)前樓小于棧中最小元素堕扶,然后再將當(dāng)前樓入棧
```
while(!leftstack.isEmpty()&&heights[i]>=leftstack.peek()){
leftstack.pop();
}
leftstack.push(heights[i]);
```
import java.util.*;
public class Solution {
/**
* 代碼中的類名稍算、方法名糊探、參數(shù)名已經(jīng)指定河闰,請(qǐng)勿修改,直接返回方法規(guī)定的值即可
*
*
* @param heights int整型一維數(shù)組
* @return int整型一維數(shù)組
*/
public int[] findBuilding (int[] heights) {
// write code here
//單調(diào)棧是單調(diào)遞增棧瞪慧,棧頂是最小值
//單調(diào)棧存的是能看到的樓
int n=heights.length;
int [] res=new int[n];
Stack<Integer> leftstack=new Stack<Integer>();
Stack<Integer> rightstack=new Stack<Integer>();
for(int i=0;i<n;i++){//向左看,i就代表當(dāng)前所處的樓
res[i]=leftstack.size();//取得左邊能看到樓的數(shù)目
//如果當(dāng)前樓大于棧中最小值弃酌,就將棧頂彈出
//代表當(dāng)前樓的高度已經(jīng)遮住最小值矢腻,所以看不到了多柑,所以需要將小于當(dāng)前樓的
//值彈出楣责,代表已經(jīng)看不到了,這是為下一次看來(lái)做準(zhǔn)備
//我們需要去更新當(dāng)前樓
while(!leftstack.isEmpty()&&heights[i]>=leftstack.peek()){
leftstack.pop();
}
leftstack.push(heights[i]);
}
for(int j=n-1;j>=0;j--){//向右看
res[j]=res[j]+rightstack.size()+1;
while(!rightstack.isEmpty()&&heights[j]>=rightstack.peek()){
rightstack.pop();
}
rightstack.push(heights[j]);
}
return res;
}
}