Java算法 —— 蓄水池问题

                     

题目:  给出了指定高度的任意两个板子,每个木板位置间隔相等,由你随机组合,怎么实现装最多的水。

分析:假设水池厚度相同,于是水容量计算公式:

                                                      水容量 =  板子距离*板子高度

                                                      板子距离:两元素的索引之差

                                                      板子高度:两元素的最小值

方法一(穷举法,为下下策,算法时间度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);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42621338/article/details/82710133
今日推荐