LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)

简介: LeetCode刷题---11. 盛最多水的容器(双指针-对撞指针)



一、编程题:167. 两数之和 II - 输入有序数组(双指针)

1.题目描述

  给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。 LeetCode题目链接。

2.示例1:

输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

3.示例2:

输入:height = [1,1]

输出:1

4.提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

二、解题思路

这次还是老规矩练习一下双指针的思想,不枉练习这么多次双指针的题,现在双指针思路算是有一点长进了。其关键点还是该怎么去移动这两个指针?这一点要理清楚。;

1.思路

解决方法1(个人想法):

  • Step 1.创建left,right分别指向数组开头和末尾,并用maxsun存储数组中得到的最大水量;
  • Step 2.通过比较height[left]和height[right]大小来决定指针的移动,当height[left]<height[right]时,要保持大的一边不动,小的一边移动到下一个元素(left++);
  • Step 3.同理当height[left]>height[right]时,右指针移动到下一位(right–);
  • Step 4.重复Step2,3步直到遍历完整个数组就能得到最大水量;

这里Step2,3步的移动时是通过贪心思想来进行的,原理上两边需要不断的向大的高度去取,就有可能会得到其最优解。

2.复杂度分析:

时间复杂度 O(N): 双指针遍历一次底边宽度N。

空间复杂度 O(1): 使用常数额外空间。


三、代码实现

。每个代码块都写了注释,方便理解,代码还可以改进;

代码如下(示例):

解法一:

class Solution {
    public int maxArea(int[] height) {
        //方法一
        int left = 0, right = height.length - 1, maxsum = 0, sum, w;
        while(left < right){
            w = right - left;
            // 两者进行比较,谁小谁先移动,直到遍历完整个数组
            if(height[left] < height[right]){
                sum = (w) * height[left++];
                maxsum = Math.max(maxsum, sum);
            }else{ 
                sum = (w) * height[right--];
                maxsum = Math.max(maxsum, sum);
            }
        }
        return maxsum;
    }
}

提交结果:


总结

以上就是今天要讲的内容,做题的时候,就是奔着双指针的思路进行解决的,联练习这么多次现在逐渐找到了点感觉。我感觉就是双指针的关键点就是在于该怎么去移动两个指针,理清这一点之后离结果也就不远了,以前不懂的时候做一题就花费一天,现在一个上午就完事了,很明显有了提示。所以就赶紧记录一下这时刻。

感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。🌹 🌹 🌹

也欢迎你,关注我。👍 👍 👍

原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!


相关文章
|
5月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
7月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
【10月更文挑战第14天】多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。
|
7月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。 #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;stdlib.h&gt; //sleep using namespace std; void t1() //普通的函数,用来执行线程 { for (int i = 0; i &lt; 10; ++i)
多线程;顺序容器;智能指针
|
8月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。 #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;stdlib.h&gt; //sleep using namespace std; void t1() //普通的函数,用来执行线程 { for (int i = 0; i &lt; 10; ++i)
|
9月前
|
Python 容器
【Leetcode刷题Python】11. 盛最多水的容器
解决LeetCode "盛最多水的容器" 问题的Python实现代码,使用了双指针的方法来找出能够容纳最多水的两条线。代码中定义了两个指针i和j,分别从数组的两端向中间遍历,通过计算两个指针所指高度的较小值与它们之间的距离的乘积来更新最大面积res。
65 0
|
9月前
|
Python
【Leetcode刷题Python】138. 复制带随机指针的链表
LeetCode上题目“138. 复制带随机指针的链表”的Python解决方案,包括两种方法:一种是在每个节点后复制一个新节点然后再分离出来形成新链表;另一种是构建一个字典来跟踪原始节点与其副本之间的映射关系,从而处理新链表的构建。
52 1
|
9月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
11月前
|
索引
力扣每日一题 6/17 枚举+双指针
力扣每日一题 6/17 枚举+双指针
58 1
|
10月前
|
算法 Java C语言
刷题训练之双指针问题
刷题训练之双指针问题
65 0