标签:
问题:这些砖块之间可以注入多少水?
其实主要分三部
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