# 2345. Finding the Number of Visible Mountains ###### tags: `Leetcode` `Medium` `Stack` Link: https://leetcode.com/problems/finding-the-number-of-visible-mountains/description/ ## 思路 直觉的想法是建立一个单调栈 里面的mountain互相不把对方遮挡住 所以我们先排序```peaks``` 然后对于每一个```peak```我们看stack pop会不会被现在的```mountain```遮盖 再检查stack top会不会把现在的```mountain```遮盖 如果不会的话我们就把现在的```mountain```加进去 但是有一个问题是如果两个山是一模一样的 那么应该要把两个山都从答案里面删掉 但是不能在```stack```遍历的时候 因为如果都删掉的话 我们就不会再删掉那些被它遮盖的山了 这里用到的方法是如果当前山和```stack.peek()```一样并且```stack.peek()```刚好是前一座山 说明```stack.peek()```现在要保留 之后要删掉 那么```cnt++``` 如果我们不去判断```stack.peek()```是不是前一座山的话如果我们碰到```[1,3],[1,3],[1,3]```的情况```cnt```会变成2 但```cnt```应该是1 因为第一个array只需要删一次 ## Code ```java= class Solution { public int visibleMountains(int[][] peaks) { Arrays.sort(peaks, (a,b)->(a[0]==b[0]?a[1]-b[1]:a[0]-b[0])); Stack<Integer> stack = new Stack<>(); int cnt = 0; for(int i=0; i<peaks.length; i++){ if(!stack.isEmpty() && peaks[stack.peek()][0]==peaks[i][0] && peaks[stack.peek()][1]==peaks[i][1]){ if(stack.peek()==i-1) cnt++; continue; } while(!stack.isEmpty() && within(peaks[stack.peek()], peaks[i])){ stack.pop(); } if(stack.isEmpty() || !within(peaks[i], peaks[stack.peek()])){ stack.add(i); } } return stack.size()-cnt; } private boolean within(int[] a, int[] b){ //whether a is in b int x = Math.abs(a[0]-b[0]); return x<=b[1] && b[1]-a[1]>=x; } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up