昨晚可贵忙的差很少,本身有点时间,作了道中等难度的题java
给定 n 个非负整数 a1,a2,...,an,每一个数表明坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器能够容纳最多的水。
图中垂直线表明输入数组 [1,8,6,2,5,4,8,3,7]。在此状况下,容器可以容纳水(表示为蓝色部分)的最大值为 49。数组
示例指针
输入: [1,8,6,2,5,4,8,3,7]
输出: 49code
以上题目描述就照搬原文了blog
1和以后的每个比较,2和以后的每个比较,n-1和n比较,即k不和k-1比较
。这样结果确定是能获得的,可是效率不言而喻,若出如今笔试题中,确定时间等过不了。第n个数
比较,次数为n-(n-1)。从左到右i,和从右到左j
。那么问题就在于如何移动下标?其实很容易,固然是移动下标处值较小的下标。public static int maxArea(int[] height) { int maxWater = 0; for(int i = 0; i < height.length -1; i++) { for(int j = i+1; j < height.length; j++) { int higth = height[i] < height[j] ? height[i] : height[j]; int tempWater = higth * (j - i); if(maxWater < tempWater) maxWater = tempWater; } } return maxWater; }
public static int maxArea2(int[] height) { int maxWater = 0; int i = 0, j = height.length - 1; int hight = 0; int temp = 0; while(i != j) { hight = height[i] < height[j] ? height[i] : height[j]; temp = hight * (j - i); if(temp > maxWater) maxWater = temp; if(height[i] <= height[j]) { i++; } else { j--; } } return maxWater; }
在上面方法中,没有用到Java的Math类,主要是以前听人说,这些类的使用会使得运行时间变长。因此我为了验证,就有了下面的方法图片
public static int maxArea3(int[] height) { int maxWater = 0; int i = 0, j = height.length - 1; while(i != j) { maxWater = Math.max(maxWater, Math.min(height[i], height[j]) * (j - i)); if(height[i] <= height[j]){ i++; } else{ j--; } } return maxWater; }
那么暴力法究竟效率有多低,使用Math类的处理,又和没用Math类的处理方法有何区别?直接上图。
对比发现:leetcode
使用Math类并不会使得效率有多大的改变,因此之后可使用这些数学类,减小代码。get
此致,敬礼数学