其实我是个好人 2014-12-30 06:23 采纳率: 100%
浏览 2106
已采纳

一道关于数组的算法题目,请用java实现。

图片说明
在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]。
假如开始下雨了,那么墙之间的水坑能够装多少水呢?
图片说明
请用java实现(任意数组求出结果)

  • 写回答

6条回答 默认 最新

  • Lizo_Is_Me 2014-12-30 10:26
    关注

    虽然方法很笨,还不知道还有另外的bug,欢迎指出,共同进步

     package lizo;
    
    /**
     * Created by Lizo on 2014/9/2.
     */
    
    
    public class test {
        public static void main(String[] args) {
            int a[] = {2, 5, 1, 2, 3, 4, 7, 7, 6,3,4};
            int len=a.length;//数组长度
            int begin = 0; //从哪个地方才开始查找凹形
            int capacity=0; //容积
    
            while (begin<len){
                //找出凹形的左边墙
                int left=findLeft(begin,a,len);
                //如果返回值等于数组的长度,则退出循环
                if(left==len){
                    break;
                }
                //找出凹形的右边墙
                int right=findRight(left,a,len);
                //如果返回值等于数组的长度,则退出循环
                if(right==len){
                    break;
                }
                //计算两个之间的容量
                capacity+=findCapacity(left,right,a);
                //重新设置查找下一个凹形开始的位置
                begin=right;
            }
            System.out.println(capacity);
    
    
        }
    
    
    
        private static int findLeft(int begin, int[] a, int len) {
            //查找左边墙的标准为,当前的墙的高度大于下一个墙的高度
            for(int i=begin;i<len-1;i++){
                if(a[i]>a[i+1]){
                    return i;
                }
            }
            return len;
        }
    
        private static int findRight(int left, int[] a, int len) {
            boolean findBottom=false; //判断是不是找到了凹形的点
            int tempRight=0;
            //查找右边墙的标准为,当前墙的高度大于等于左边墙的高度
            for(int i=left+2;i<len;i++){
    
                if(!findBottom && a[i]>a[i-1]){
                    findBottom=true;
                    tempRight=i;
                }
                if(!findBottom) continue;
                //找到了凹形的点之后才开始找右边的墙
                else{
                    if(a[i]>=a[left]){
                        return i;
                    }
                    if(a[i]>a[tempRight]){
                        tempRight=i;
                    }
                }
    
    
            }
    
            return tempRight>0?tempRight:len;
        }
    
        private static int findCapacity(int left, int right, int[] a) {
            //找出左右墙的较低的强
            int min=Math.min(a[left],a[right]);
            int c=0;
            //计算凹形容积
            for(int i=left+1;i<right;i++){
                int tempc=min-a[i];
                c+=(tempc>0)?tempc:0;
            }
            return c;
        }
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?