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

来源:互联网 发布:ip网络座机怎样使用 编辑:程序博客网 时间:2024/04/29 20:46
“看下面这个图片”

“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[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;}}



1 0
原创粉丝点击