首页 > 试题广场 >

枪打出头鸟

[编程题]枪打出头鸟
  • 热度指数:5957 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现在有n个人站成一列,第i个人的身高为

他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第i个人射击的水弹,就会击中在他前面第一个比他高的人。
牛牛认为这样的练习十分的荒唐,完全就是对长得高的人的伤害。
于是它定义了一个荒唐度,初始为0。
对于第i个人,如中他击中了第j个人,则荒唐度加j,如果没有击中任何人,则荒唐度加0.
牛牛想问你,你能计算出荒唐度是多少吗?

示例1

输入

5,[1,2,3,4,5]

输出

0

说明

没有一个人击中任何一个人 
示例2

输入

5,[5,4,3,2,1]

输出

10

说明

第二个人击中第一个人,第三个人击中第二个人,第四个人击中第三个人,第五个人击中第四个人; 1+2+3+4=10 

备注:
一个整数n()
一个数组a()
a下标从0开始,
public class Solution {
    /**
     * 
     * @param n int整型 n个人
     * @param a int整型一维数组 ai代表第i个人的高度
     * @return long长整型
     * 用栈,随指针i,只存降序数列(包括指针),降序存,升序出
     * 例如:1254312312
     *   i: 0123456789
     * 1,2,5,54,543,5431,5432,543,5431,5432
     * 0,1,2,3 ,4  ,5   ,6   ,7  ,8   ,9
     */
    public long solve (int n, int[] a) {
        // write code here
        if(n<=1) {
            return 0;
        }
        if(n==2) {
            return a[0]>a[1] ? 1 : 0;
        }
        List<Integer> stack = new ArrayList<>();
        long j=0;
        for(int i=0; i<n; i++) {
            while(!stack.isEmpty() && a[i]>=a[stack.get(stack.size()-1)]) {
                stack.remove(stack.size()-1);
            }
            if(!stack.isEmpty()) {
                j+=stack.get(stack.size()-1)+1;
            }
            stack.add(i);
        }
        return j;
    }
}
发表于 2020-07-05 11:48:41 回复(0)
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 ht=0;
        int[] hts=new int[n];
        int pre=0,ppre=0;
        if(n<=1){
            return 0;
        }
        if(a[0]>a[1]){
            ht=1;
            hts[1]=1;
        }
        if(n==2){
            return ht;
        }
        pre=1;
        ppre=hts[pre-1];
        for(int i=2;i<n;i++){
            if(a[i]<a[i-1]){
                hts[i]=i;
            }else{
                pre=i-1;
                while(a[i]>=a[pre]&&(ppre=hts[pre])!=0){
                    if(a[i]<a[ppre-1]){
                        hts[i]=ppre;
                        break;
                    }else{
                        pre=ppre-1;
                    }
                }
            }
            ht+=hts[i];
        }
        return ht;
    }
}

发表于 2020-06-15 23:31:03 回复(1)