问题还原:
统计出一个给定数组的蓄水总量(把数组的每个位置的数看是做地势高低)
比如: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;
}
}
}