A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 炎星辰 于 2014-4-29 19:20 编辑

给你一个二维数组(比如是M*N的),把他们放入M*N的方格中,每个数字代表该方格的高度,这样就俯视就会形成凹凸不平,如果用这个形状存储水,凹的地方会有积水,请问它能存储多少水?
例如二维数组为:
9 9 9 9
3 0 0 9
7 8 9 6
时,答案是中间的0,0位置可以存储3(因为其外面最低是3,即“木桶效应”)个单位的水,因此答案为3+3=6

3 个回复

倒序浏览
看起来有意思,其实也不是很难,下面是我的代码;

  1. package cn.itheima.luntan;

  2. public class Demo4 {

  3.         /**9 9 9 9
  4.        3 0 0 9
  5.        7 8 9 6
  6.        算出外围最小的数,在用这个最小的数去减外围之外内的数,为负数,说明该处的值比外围最小数大,是不能存水的,
  7.        直接跳过这块板,也就是认为它装水为0,为正则相加得到能装多少水,
  8.        这是我的理解
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 // TODO Auto-generated method stub
  13.                 int min=100000;
  14.                 int x=0;
  15.                 int y=0;
  16.                 int num[][]={{9,3,7},{9,0,8},{9,0,9},{9,9,6}};
  17.                 for(int i=0;i<num.length;i++){
  18.                         for(int j=0;j<num[0].length;j++){
  19.                                 if(i==0 || i==num.length-1){
  20.                                         while(num[i][j]<min){
  21.                                                 min=num[i][j];
  22.                                                
  23.                                         }
  24.                                 }else{
  25.                                         if(num[i][0]<min){
  26.                                                 min=num[i][0];
  27.                                         }
  28.                                         if(num[i][num[0].length-1]<min){
  29.                                                 min=num[i][num[0].length-1];
  30.                                         }
  31.                                 }
  32.                         }
  33.                        
  34.                 }
  35.                 for(int n=1;n<num.length-1;n++){
  36.                        
  37.                         for(int m=1;m<num[0].length-1;m++){
  38.                                 x+=min-num[n][m];
  39.                                 if(x<0){
  40.                                         x=0;
  41.                                 }
  42.                                
  43.                                 y+=x;
  44.                                 x=0;
  45.                                
  46.                        
  47.                         }
  48.                 }
  49.                
  50.                 System.out.println(min);
  51.                 System.out.println(y);
  52.         }

  53. }
复制代码


回复 使用道具 举报
刚开始学习数组,学习学习
回复 使用道具 举报
龙健 发表于 2014-4-28 16:32
看起来有意思,其实也不是很难,下面是我的代码;

你题目没理解清楚,不一定是外围最小
如果对于二维数组(记作:数组1):
9 9 9 9 9
9 1 5 1 9
9 5 6 5 9
9 2 5 2 9
9 0 9 9 9
按照你的程序结果是0,但实际应该是11。
验证如下,上面每个数字可添加的值如下(记作:数组2):
0 0 0 0 0
0 4 0 4 0
0 0 0 0 0
0 0 0 3 0
0 0 0 0 0
将 数组1 + 数组2 后形成 数组3:
9 9 9 9 9
9 5 5 5 9
9 5 6 5 9
9 2 5 5 9
9 0 9 9 9
因为数组3已经不能储存水,因此答案为11

备注:我个人感觉,我的求证过程貌似提供了一个解决题目的思路
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马