算法题-注水问题

技术分享


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

其实主要分三部

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


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。