题解 | #枪打出头鸟#

枪打出头鸟

http://www.nowcoder.com/practice/1504075c856248748ca444c8c093d638

观察题目发现一个特性:能否射到前面的人,是从后往前看的,也就是逆序的观察数组数据,这是不是很像栈的特性?

  • 于是我们建立一个辅助栈,并从后往前的遍历数组。
    • 如果栈不为空而且当前遍历元素大于栈顶元素,此时发生射击事件。那么循环将栈顶元素出栈同时累加被射击者位置,直到不满足循环条件,即射击事件不再发生
    • 当栈空或者当前遍历元素小于等于栈顶元素时,不发生射击事件,将当前元素放入栈中
      import java.util.*;
      public class Solution {
       /**
        * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
        *
        * 
        * @param n int整型 n个人
        * @param a int整型一维数组 ai代表第i个人的高度
        * @return long长整型
        */
       public long solve (int n, int[] a) {
           // write code here
           long sum = 0;
           Stack<Integer> stack = new Stack<>();
           for(int cur = n-1; cur >= 0 ;cur--){
               while(stack.size() > 0 && a[cur] > stack.peek()){
                 sum = sum+cur+1;
                 stack.pop();
               }
               stack.push(a[cur]);
           }
           return (long)sum;
       }
      }
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务