【LeetCode每日一题】——11.盛水最多的容器

一【题目类别】

  • 数组

二【题目难度】

  • 中等

三【题目编号】

  • 11.盛水最多的容器

四【题目描述】

  • 给你 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

六【题目提示】

  • n = h e i g h t . l e n g t h n = height.length n=height.length
  • 2 < = n < = 3 ∗ 1 0 4 2 <= n <= 3 * 10^4 2<=n<=3104
  • 0 < = h e i g h t [ i ] < = 3 ∗ 1 0 4 0 <= height[i] <= 3 * 10^4 0<=height[i]<=3104

七【解题思路】

  • 双指针,一个指向开始一个指向结尾,此时底最大,如果高也最大就会是最大容量,但是当移动指针时会伴随着底变小,所以我们要想办法让高变大,这样容积才能最大,既然我们要高最大,所以就移动高小的那个指针就可以,这样就保留了较高的一端,放弃了较矮的一端,就能保证容积可以变大,值得注意的一点是,计算容积的时候计算的是较矮的一段的高度,否则液体会溢出,其实里面有贪心的思想,就是每次移动我们都要得到最大的容量

八【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N)

九【代码实现】

  1. Java语言版
package Array;

public class p11_ContainerWithMostWater {

    public static void main(String[] args) {
        int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
        int res = maxArea(height);
        System.out.println("res = " + res);
    }

    public static int maxArea(int[] height) {
        int leftIndex = 0;
        int rightIndex = height.length - 1;
        int res = 0;
        while (leftIndex < rightIndex) {
            res = height[leftIndex] < height[rightIndex] ? Math.max(res, (rightIndex - leftIndex) * height[leftIndex++]) : Math.max(res, (rightIndex - leftIndex) * height[rightIndex--]);
        }
        return res;
    }

}
  1. C语言版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int MAX(int x, int y)
{
	if (x > y)
	{
		return x;
	}
	return y;
}

int maxArea(int* height, int heightSize)
{
	int leftIndex = 0;
	int rightIndex = heightSize - 1;
	int res = 0;
	while (leftIndex < rightIndex)
	{
		res = height[leftIndex] < height[rightIndex] ? MAX(res, (rightIndex - leftIndex) * height[leftIndex++]) : MAX(res, (rightIndex - leftIndex) * height[rightIndex--]);
	}
	return res;
}

/*ʡ*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述
  2. C语言版
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值