LeetCode11-Container With Most Water

题目链接: https://leetcode.com/problems/container-with-most-water/

两点法,规定两点构建初始枚举范围,然后通过题目特点,移动(舍弃)其中一点,缩小枚举范围,直至不能继续枚举。比较过程中产生的结果值,得到正确答案。

题面

Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.

示意图
The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

题意

n 个非负整数 a1, a2, a3, …, an,分别表示 n 个不同高度的垂直线,水平间隔为 1。 面积等于两根垂直线之间的水平距离与短边构成的矩形面积。求最大面积。

方法

暴力

在 LeetCode 上,这道题通过两两暴力枚举是可以 AC 的,复杂度 O(N^2),暴力就没啥好说的了。

int maxArea(vector<int>& height) {
    int maxA = 0;

    int len = height.size();
    for (int i = 0; i < len; i++) {
        for (int j = i + 1; j < len; j++) {
            int a = (j - i) * min(height[j], height[i]);
            maxA = max(a, maxA);
        }
    }

    return maxA;
}

两点法

矩形面积由两边之间水平长度和短边高度决定,而这个方法就是利用不断缩小两边水平长度、舍弃短边,枚举最大面积。复杂度为 O(N)。

首先,分别以最左和最右两条垂直线为左右两边的端点,计算面积,然后移动短边所在端点,向中间靠近一个单位,计算新的面积,与之前面积比较并取大。

之所以移动短边端点,而不移动长边端点,是因为进一步枚举,势必缩短水平长度,如果移动长边,矩阵高度只会保持或减小,所以面积只可能缩小;而移动短边,矩阵高度可能会增加,虽然水平长度减小,但面积仍有可能增大。

int maxArea(vector<int>& height) {
    int maxA = 0;
	int l = 0;
	int r = height.size() - 1;
	
	while (l < r) {
	    int a = (r - l) * min (height[l], height[r]);
		maxA = max(a, maxA);
		if (height[l] < height[r])
		    l++;
		else
		    r--;
	}
	
	return maxA;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值