小程序1-----统计出一个给定数组的蓄水总量(把数组的每个位置的数看是做地势高低)

问题还原:

统计出一个给定数组的蓄水总量(把数组的每个位置的数看是做地势高低)
比如:int[] intArray = [4,3,2,5,6,4,4,7]

能蓄水:[0,1,2,0,0,2,2,0] 所以总量是:7

通过拆分思想

把数组切成很多个 01数组,统计每个01数组中的合法0的总个数即可(见下面的图解)

如图示:浅红色阴影的部分为蓄水量;


代码:

/**
 * 作者: MZH:http://blog.csdn.net/zhongqi2513
 * 描述:
		统计出一个给定数组的蓄水总量(把数组的每个位置的数看是做地势高低)
		比如:int[] intArray = new int[]{4,3,2,5,6,4,4,7}
		能蓄水:[0,1,2,0,0,2,2,0] 所以总量是:7
		
	核心思路:把数组切成很多个 01数组,统计每个01数组中的合法0的总个数即可
 */
public class Exam5_WaterStoreOfArray {

    public static void main(String[] args) {
    	
//    	int[] intArray = new int[]{4,3,2,5,6,4,4,7};
//    	int[] intArray = new int[]{1,2,3,4,5,6};
    	int[] intArray = new int[]{3,1,2,7,3,8,4,9,5,6};
    	
    	int totalWater = getArrayWater(intArray);
    	System.out.println(totalWater);
    }
    
    /**
     * 日期:2018年3月12日下午8:31:00
     * 求出数组中的水数
     */
    private static int getArrayWater(int[] intArray) {
    	
    	int findMaxValueOfArray = findMaxValueOfArray(intArray);
    	int findMinValueOfArray = findMinValueOfArray(intArray);
    	int length = intArray.length;
    	
    	int totalWater = 0;
    	
    	// 循环次数就是最大值和最小值的差
    	for(int i=findMinValueOfArray; i<findMaxValueOfArray; i++){
    		int[] tempArray = new int[length];
    		for(int j=0; j<length; j++){
    			if(intArray[j] > i){
    				tempArray[j] = 1;
    			}else{
    				tempArray[j] = 0;
    			}
    		}
    		int waterOfOneZeroArray = getWaterOfOneZeroArray(tempArray);
    		totalWater += waterOfOneZeroArray;
    	}
    	
    	return totalWater;
	}

    

    /**
     * 寻找逻辑是:从左右开始各找一个1,然后这两个1之间的所有0的个数,就是水数
     */
    private static int getWaterOfOneZeroArray(int[] tempArray) {
    	
    	int length = tempArray.length;
    	int toatalWater = 0;
    	
    	// 找左边的1
    	int i = 0;
    	while(i < length){
    		if(tempArray[i] == 1){
    			break;
    		}
    		i++;
    	}
    	
    	// 从右边开始找1
    	int j=length-1;
    	while(j >= i){
    		if(tempArray[j] == 1){
    			break;
    		}
    		j--;
    	}
    	
    	if(i == j || i + 1 == j){
    		return 0;
    	}else{
    		for(int k=i+1; k<j; k++){
    			if(tempArray[k] == 0){
    				toatalWater++;
    			}
    		}
    		return toatalWater;
    	}
	}

	/**
     * 描述:找出一个数组中的最大值
     */
	public static int findMaxValueOfArray(int[] intArray){
    	int length = intArray.length;
    	if(length == 0){
    		return 0;
    	}else if(length == 1){
    		return intArray[0];
    	}else{
    		int max = intArray[0];
    		for(int i=1; i<length; i++){
        		if(intArray[i] > max){
        			max = intArray[i];
        		}
        	}
    		return max;
    	}
    }
	
	/**
	 * 找出一个数组中的最小值
	 */
	public static int findMinValueOfArray(int[] intArray){
    	int length = intArray.length;
    	if(length == 0){
    		return 0;
    	}else if(length == 1){
    		return intArray[0];
    	}else{
    		int min = intArray[0];
    		for(int i=1; i<length; i++){
        		if(intArray[i] < min){
        			min = intArray[i];
        		}
        	}
    		return min;
    	}
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值