Leetcode--11. 盛水最多的容器
給定 n 個非負整數 a1,a2,...,an,每個數代表坐標中的一個點?(i,?ai) 。在坐標內畫 n 條垂直線,垂直線 i?的兩個端點分別為?(i,?ai) 和 (i, 0)。找出其中的兩條線,使得它們與?x?軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且?n?的值至少為 2。
圖中垂直線代表輸入數組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為?49。
示例:
輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49
一 暴力解法
public class Solution11 {
?? ?public static int maxArea(int[] height) {
?? ??? ? int i,j,max=0;
?? ??? ? int n = height.length;
?? ??? ? for(i=0;i<n;i++)
?? ??? ? {
?? ??? ??? ? for(j=i;j<n;j++)
?? ??? ??? ? {
?? ??? ??? ??? ? if((j-i)*java.lang.Math.min(height[i], height[j])>max)
?? ??? ??? ??? ? {
?? ??? ??? ??? ??? ? max = (j-i)*java.lang.Math.min(height[i], height[j]);
?? ??? ??? ??? ? }
?? ??? ??? ? }
?? ??? ? }
?? ??? ? return max;
?? ? ? ? ? ?
?? ? ? ?}
?? ? public static void main(String[] args)
?? ? {
?? ??? ? int[] a = {1,8,6,2,5,4,8,3,7};
?? ??? ? System.out.println(maxArea(a));
?? ? }
}
二 雙標記法?
首尾各設置一個標記,每一次的面積都決定于寬度和短柱子的高度,
所以只需要變化短柱子即可。
i,j分別放置于首尾處,如果第一根柱子短,i向后移動一位,否則,j向前移動一位
public class Solution11 {
?? ?
?? ?public static int maxArea(int[] height) {
?? ??? ? int i,j,max=0;
?? ??? ? int n = height.length;
?? ??? ? i=0;j=n-1;
?? ??? ? while(i<j)
?? ??? ? {
?? ??? ??? ? if((j-i)*java.lang.Math.min(height[i], height[j])>max)
?? ??? ??? ? {
?? ??? ??? ??? ? max = (j-i)*java.lang.Math.min(height[i], height[j]);
?? ??? ??? ? }
?? ??? ??? ? if(height[i]>height[j])
?? ??? ??? ? {
?? ??? ??? ??? ? j--;
?? ??? ??? ? }
?? ??? ??? ? else
?? ??? ??? ? {
?? ??? ??? ??? ? i++;
?? ??? ??? ? }
?? ??? ? }
?? ??? ? return max;
?? ? ? ? ? ?
?? ? ? ?}
?? ? public static void main(String[] args)
?? ? {
?? ??? ? int[] a = {1,8,6,2,5,4,8,3,7};
?? ??? ? System.out.println(maxArea(a));
?? ? }
}
?
總結
以上是生活随笔為你收集整理的Leetcode--11. 盛水最多的容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--1111. 有效括号
- 下一篇: 7-2 是否完全二叉搜索树 (30分)