题目: 给出了指定高度的任意两个板子,每个木板位置间隔相等,由你随机组合,怎么实现装最多的水。
分析:假设水池厚度相同,于是水容量计算公式:
水容量 = 板子距离*板子高度
板子距离:两元素的索引之差
板子高度:两元素的最小值
方法一(穷举法,为下下策,算法时间度O(N^2),不推荐):
public class Water {
int ss = 0;
Random ran = new Random();
static int[] arr = new int[5];
public static void main(String[] args) {
Water wa = new Water();
wa.get();
wa.count();
}
public void get() {
for(int i = 0;i<arr.length;i++) {
arr[i] = ran.nextInt(10)+5;
}
}
public void count() {
for(int i = 0;i<arr.length-1;i++) {
int a = arr[i];
for(int j = i+1;j<arr.length;j++) {
int x = j - i;
int b = arr[j]
int s = Math.min(a, b)*x;
if(ss<s) {
ss = s;
}
}
}
System.out.println("最大蓄水量为"+ss+"*(水池宽));
}
}
方法二(利用角标进行高度对比,取出最优,推荐):
取到了每两个柱子之间能取到的最大面积
找到较矮的柱子a和较高柱子b,此时a的面积是最大宽度范围的最大面积。移动,更新得到新的柱子。比较高度得到新的a,b,这时的a的面积又是它最大宽度范围的最大面积。以此类推,得到的始终是最大面积,不会遗漏。比较面积大小就ok咯~
public class Water {
public static void main(String[] args) {
int[] ls = {3,8,2,1,9,5,3};
int l = ls.length;
int i = 0;
int j = l - 1;
int max = 0;
int s;
while(i<j) {
s = (j-i)*Math.min(ls[i], ls[j]);
if(ls[i]<ls[j])
i++;
else
j--;
if(s>max) {
max = s;
}
}
System.out.println("最大蓄水量为"+max);
}
}