每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/container-with-most-water/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度是中等
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2
package com.example.likou.likou2;
/*
这道题的做法,感觉这种题目一看到就是用暴力破解的方法,然后咔咔咔两个for循环下去,很完美。然后,发现运行有比较多的问题,但是这也是第一时间相当的方法,不是很完善,然后我再后面附上了另外一种简单的想法
*/
public class MaxArea {
public static int maxArea1(int[] height) {
int maxSize = 0 ;
int h = 0 ;
int preSize ;
for (int i = 0; i < height.length; i++) {
for (int j = 0; j < height.length; j++) {
/*
这里主要是判断两个高,谁最高,然后取矮的那个为最后的高
*/
h = height[j] > height[i] ? height[i] : height[j];
/*
这里主要是计算面积
*/
preSize = h * (j-i) ;
/*
这里主要是判断最大的面积
*/
maxSize = maxSize > preSize ? maxSize : preSize;
}
}
return maxSize ;
}
public static void main(String[] args) {
int[] array = {1,2,100,8,9};
System.out.println(maxArea1(array));
}
}
package com.example.likou.likou2;
/*
这道题的做法,其实也是两个for循环的方式,然后不同的一点是,不是两个数都往上面加,而是一个家,一个减,叫做双指针模式。
这里要明白的一点是,如果两个指针中间隔了一个长,然后高取两个指针中间的矮的,算出面积之后,只移动其中的一个指针,那么移动的指针肯定是低的那个指针,然后算出面积再比较。(可以想到,这样移动其实是合理的,因为面积是两数相乘,然后移动矮的那边后,肯定面积会小于移动大的那边的指针)
*/
public class MaxArea {
public static int maxArea1(int[] height) {
int maxSize = 0 ;
int h = 0 ;
int preSize ;
int i = 0;
int j = height.length -1 ;
while (i != j){
/*
这里主要是判断两个高,谁最高,然后取矮的那个为最后的高
*/
h = height[j] > height[i] ? height[i] : height[j];
/*
这里主要是计算面积
*/
preSize = h * (j-i) ;
/*
这里主要是判断最大的面积
*/
maxSize = maxSize > preSize ? maxSize : preSize;
if(height[j] > height[i]){
i++;
}else{
j--;
}
}
return maxSize ;
}
public static void main(String[] args) {
int[] array = {1,2,100,8,9};
System.out.println(maxArea1(array));
}
}
上一篇文章:每天一道算法题系列八之回文数
请继续关注我,如果后面不忙了,会写一系列关于的设计模式的文章。
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。