码迷,mamicode.com
首页 > 编程语言 > 详细

算法题-注水问题

时间:2015-03-19 13:21:24      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

技术分享


问题:这些砖块之间可以注入多少水?

其实主要分三部

1,取出这些砖块的最大高度和第二大高度

2,第二大高度乘上最大高度和第二大高度之间的距离,再减去中间的砖块,得出最大高度和第二大高度之间可以注入多少水

3,分别向最大高度和第二大高度之外的部分递归,得出最后的值

package com.test;

public class Test
{
    static int result = 0;  //  最终结果
    static int[] wallHeights = new int[]
    {1,6,1,2,3,4,100,1,9};  //  表示所有的墙的高度

    public static void process(int start, int end)
    {
        //  first:start和end之间最高的墙
        //  second:start和end之间第二高的墙
        int first = 0, second = 0;
        //  firstIndex:第一高的墙在wallHeights中的索引
        //  secondIndex:第二高的墙在wallHeights中的索引
        int firstIndex = 0, secondIndex = 0;
        //  两堵墙必须至少有一堵墙的距离
        if (end - start <= 1)
            return;
        //  开始获取第一高和第二高墙的砖数
        //  冒泡
        for (int i = start+1; i <= end; i++)
        {	
    		if(wallHeights[i]>wallHeights[secondIndex]){
    			if(wallHeights[i]>wallHeights[firstIndex])
    			{
    				//如果比第二大大又比第一大大,则i是第一大,第一大变成第二大
    				secondIndex = firstIndex;
    				firstIndex = i;
    			}
    			else
    			{
    				//如果比第二大大又比第一大小,则i是大二大,第一大不变
    				secondIndex = i;
    			}	
    		}
        }
        
        first = wallHeights[firstIndex];
        System.out.println("firstIndex  "+firstIndex);
        System.out.println("first  "+first);
        
        second = wallHeights[secondIndex];
        System.out.println("secondIndex  "+secondIndex);
        System.out.println("second  "+second);
        
        

        //  获取左侧墙的索引
        int startIndex = Math.min(firstIndex, secondIndex);
        //  获取右侧墙的索引
        int endIndex = Math.max(firstIndex, secondIndex);
        //  计算距离
        int distance = endIndex - startIndex;
        //  如果第一高的墙和第二高的墙之间至少有一堵墙,那么开始计算这两堵墙之间可以放多少个单位的水
        if (distance > 1)
        {
            result = result + (distance - 1) * second;
            //  减去这两堵墙之间的砖数
            for (int i = startIndex + 1; i < endIndex; i++)
            {
                result -= wallHeights[i];
            }
            
        }
        //  开始递归处理左侧墙距离开始位置能放多少水
        process(start, startIndex);
        //  开始递归处理右侧墙距离结束位置能放多少水
        process(endIndex, end);
    }

    public static void main(String[] args)
    {
        process(0, wallHeights.length - 1);
        System.out.println(result);

    }

}

在此文章的基础上改的,中间部分不太明白,换成了自己的

http://blog.csdn.net/nokiaguy/article/details/14023225


算法题-注水问题

标签:

原文地址:http://blog.csdn.net/superjunjin/article/details/44454845

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!