首页 > 其他分享 >leetcode11. 盛最多水的容器,双指针法

leetcode11. 盛最多水的容器,双指针法

时间:2025-01-19 13:59:56浏览次数:3  
标签:柱子 水量 int res height leetcode11 最多水 指针

leetcode11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 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

在这里插入图片描述

题目分析

我们需要找到能够容纳最多水的两根柱子,并返回它们所能容纳的水量。我们可以使用双指针方法,从数组的两端开始向中间移动,每次移动较短的柱子,计算当前柱子所能容纳的水量,并更新最大水量。

总体思维导图

  • 寻找最多水的两根柱子
  • 使用双指针方法
  • 从数组的两端开始向中间移动
  • 每次移动较短的柱子
  • 计算当前柱子所能容纳的水量
  • 更新最大水量

算法步骤

  1. 初始化左右指针 l 和 r,分别指向数组的两端。
  2. 当 l<r 时,执行以下步骤:
    • 计算当前柱子所能容纳的水量 temp=min(height[l],height[r])*(r-l)。
    • 更新最大水量 res=max(res,temp)。
    • 如果 height[l]<=height[r],则 l++;否则 r–。
  3. 返回最大水量 res。

具体代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res=INT_MIN;
        int l=0;
        int r=height.size()-1;
        while(l<r)
        {
        int temp=min(height[l],height[r])*(r-l);
        res=max(res,temp);
        if(height[l]<=height[r]) l++;
        else r--;
        }
        return res;
    }
};
func maxArea(height []int) int {
    l:=0
    r:=len(height)-1
    res:=0
    for ;l<r;{
        temp:=min(height[l],height[r])
        res=max(res,temp*(r-l))
        if(height[l]<=height[r]){
            l++
        }else{
            r--
        }
    }
    return res
}

算法流程图

开始 初始化指针 检查指针是否相交 计算当前水量 返回最大水量 更新最大水量 移动较短柱子的指针 结束

算法分析

  • 时间复杂度:O(n),其中 n 是数组的长度。
  • 空间复杂度:O(1)。
  • 易错点:在更新左右指针时,需要根据当前柱子的高度来决定移动哪个指针。
  • 注意事项:在计算当前柱子所能容纳的水量时,需要使用 min(height[l],height[r])*(r-l) 来计算。

相似题目

题目链接
盛最多水的容器https://leetcode.cn/problems/container-with-most-water/
接雨水https://leetcode.cn/problems/trapping-rain-water/
盛水最多的容器https://leetcode.cn/problems/water-and-jug-problem/

标签:柱子,水量,int,res,height,leetcode11,最多水,指针
From: https://blog.csdn.net/qq_51350957/article/details/145236705

相关文章

  • C++模板--packaged_task 如何打包 lambda 和函数指针?
    从它的构造函数上看,似乎不能接受lambda和函数指针作为构造函数的参数但可以通过如下自定义推导规则来实现.这实际上是DeductionGuides技术//1template<class_Rp,class..._Args>packaged_task(_Rp(*)(_Args...))->packaged_task<_Rp(_Args...)>;//2template......
  • 力扣209(2)——滑动窗口?!快慢指针的pro版罢了
    题目及暴力法在我的这篇博客,有兴趣的可以移步到这里:力扣209题长度最小的子数组这次给出一种新解法滑动窗口法classmian{publicintmin(inttarget,int[]nums){//滑动窗口法,快慢指针的pro版intn=nums.length;intmin......
  • 嵌入式基础 C语言篇 指针初阶
    一、指针的入门(1)、预备知识0、图解:1、内存地址字节:字节是内存的容量单位,英文称为byte,一个字节有8位,即1byte(00000000---11111111)=8bits(0---1)地址:系统为了便于区分每一个字节而对它们逐一进行的编号,称为内存地址,简称地址。在32位系统:说明:地址+1就是......
  • GESP C++四级考试:指针
    C++指针的考试内容指针的基本概念指针是一种特殊的变量,用于存储数据的内存地址。指针变量中存储的是内存地址,定义指针变量时必须指定其指向的类型。指针的类型指针可以指向任意类型的数据,包括基本数据类型(如int、char、float等)和自定义复杂类型(如结构体)。不同类型的数据占用......
  • PowerShell 脚本调整鼠标指针的速度,虽然这不会直接影响鼠标的 DPI(硬件设置)。这个方法
    在PowerShell中,直接通过系统设置控制鼠标DPI或鼠标速度并不是一个简单的操作,因为这些设置通常依赖于硬件和驱动程序。大部分操作系统(包括Windows)本身并不提供简单的接口来直接控制DPI设置。通常,这些设置通过鼠标驱动程序或专门的鼠标软件来管理(例如:Logitech、Razer、Corsai......
  • 【LeetCode: 415. 字符串相加 + 双指针】
    ......
  • golang 指针传递和值传递
    golang指针传递和值传递packagemainimport"fmt"typeMyStructstruct{ Valuestring}//值传递//ModifyStructtakesaMyStructbyvalueandtriestomodifyit.funcModifyStruct(sMyStruct){ s.Value="Modified"}//指针传递//ModifySt......
  • 超高频算法——双指针思想的领悟 python
    目录问题引入1解决方案牛刀小试问题引入2解决方案举一反三实战演练(双指针)问题引入3Whatis滑动窗口关键要素实战演练(滑动窗口)总结问题引入1给你一个数组(按非递减顺序排列),假定为【2,4,5,6,7,9】请你在数组中找到两个数满足:相加等于10,返回它们的值。你是一个不知道双......
  • lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)
    【题目来源】https://www.lanqiao.cn/problems/3333/learning/【题目描述】肖恩提出了一种新的排序方法。该排序方法需要一个标准数组B和一个待排序数组A。在确保对于所有位置i都有A[i]>B[i]的前提下,肖恩可以自由选择A数组的排序结果。请计算按照这种排序方法,待排序......
  • 双指针+回文数组
    https://codeforces.com/problemset/problem/1610/B#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'usingll=longlong;usingpii=pair<int,int>;constdoublePI=acos(-1);constintN=2e5+10;constintmod=1e9......