• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C++实现LeetCode(11.装最多水的容器)

c++ 搞代码 4年前 (2022-01-06) 41次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了C++实现LeetCode(11.装最多水的容器),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 11. Container With Most Water 装最多水的容器

Given n non-negative integers a1a2, …, an , where each represents a point at coordinate (i

来源gao!%daima.com搞$代*!码$网

ai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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 nis 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.

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

这道求装最多水的容器的题和那道 Trapping Rain Water 很类似,但又有些不同,那道题让求整个能收集雨水的量,这道只是让求最大的一个的装水量,而且还有一点不同的是,那道题容器边缘不能算在里面,而这道题却可以算,相比较来说还是这道题容易一些,这里需要定义i和j两个指针分别指向数组的左右两端,然后两个指针向中间搜索,每移动一次算一个值和结果比较取较大的,容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离,代码如下:

C++ 解法一:

 class Solution { public: int maxArea(vector& height) { int res = 0, i = 0, j = height.size() - 1; while (i <j) { res = max(res, min(height[i], height[j]) * (j - i)); height[i] <height[j] ? ++i : --j; } return res; } };

Java 解法一:

 public class Solution { public int maxArea(int[] height) { int res = 0, i = 0, j = height.length - 1; while (i <j) { res = Math.max(res, Math.min(height[i], height[j]) * (j - i)); if (height[i] <height[j]) ++i; else --j; } return res; } }

这里需要注意的是,由于 Java 中的三元运算符 A?B:C 必须须要有返回值,所以只能用 if..else.. 来替换,不知道 Java 对于三元运算符这么严格的限制的原因是什么。

下面这种方法是对上面的方法进行了小幅度的优化,对于相同的高度们直接移动i和j就行了,不再进行计算容量了,参见代码如下:

C++ 解法二:

 class Solution { public: int maxArea(vector& height) { int res = 0, i = 0, j = height.size() - 1; while (i <j) { int h = min(height[i], height[j]); res = max(res, h * (j - i)); while (i <j && h== height[i]) ++i; while (i < j height[j]) --j; } return res; };

Java 解法二:

 public class Solution { public int maxArea(int[] height) { int res = 0, i = 0, j = height.length - 1; while (i <j) { int h = Math.min(height[i], height[j]); res = Math.max(res, h * (j - i)); while (i <j && h== height[i]) ++i; while (i < j height[j]) --j; } return res; }

以上就是C++实现LeetCode(11.装最多水的容器)的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C++实现LeetCode(11.装最多水的容器)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址