Twitter面试题之墙之间的水坑装雨水问题

“看下面这个图片”

“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”

“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”

“以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。
package cn.baokx;

public class Test0 {
	public static void main(String[] args) {
		int [] a1 = {2,5,1,2,3,4,7,7,6};
		int [] a2 = {2,5,1,3,1,2,1,7,7,6};
		int [] a3 = {6,1,4,6,7,5,1,6,4};
		System.out.println(getResult(a1));
		System.out.println(getResult(a2));
		System.out.println(getResult(a3));
	}
	public static int getResult(int [] a){
		if(a==null||a.length<3){
			return 0 ;
		}
		int result = 0 ;
		int array_max = getRightMax(a,0);
		int left_max = a[0] ;
		int right_max = getRightMax(a,2);
		//遍历下标为1至a.length-2的数组元素
		for(int i = 1 ; i < a.length - 1 ; i++){
			right_max = getRightMax(a,i+1);
			// 只有当前元素高度和左边最大值和右边最大值相比均小于的时候才可以装水
			if(a[i] < left_max && a[i] < right_max){
				result += array_max-Math.abs(left_max - right_max)-a[i];
			}
			left_max = a[i]>left_max?a[i]:left_max;
		}
		return result;
	}
	public static int getRightMax(int [] array,int index){
		int max = array[index];
		for(int i = index ; i < array.length ; i++){
			max = array[i]>max?array[i]:max;
		}
		return max;
	}
}

另外一种方式,时间复杂度更小(---by tianshen0128)
package cn.baokx;

public class Test11 {
	public static void main(String[] args) {
		int [] a1 = {2,5,1,2,3,4,7,7,6};
		int [] a2 = {2,5,1,3,1,2,1,7,7,6};
		int [] a3 = {6,1,4,6,7,5,1,6,4};
		System.out.println(getResult(a1));
		System.out.println(getResult(a2));
		System.out.println(getResult(a3));
		
	}
	public static int getResult(int [] array){
		int sum = getIntArraySum(array);
		//获得最大值,及坐标
		int max = 0;
		int max_index = 0;
		for (int i = 0; i < array.length; i++) {
			if(array[i]>max){
				max = array[i]; 
				max_index = i;
			}
		}
		int left_max = 0;
		for (int i = 0; i <= max_index; i++) {
			if( array[i]<left_max){
				array[i]=left_max;
			}else{
				left_max=array[i];
			}
		}
		int right_max = 0;
		for (int i = array.length-1; i > max_index; i--) {
			if( array[i]<right_max){
				array[i]=right_max;
			}else{
				right_max=array[i];
			}
		}
		return getIntArraySum(array)-sum;
	}
	public static int getIntArraySum(int[] array){
		int result = 0;
		for (int i = 0; i < array.length; i++) {
			result+=array[i];
		}
		return result;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值