leecode 11.盛水最多的容器

本文介绍了一种利用双指针技术解决给定整数数组表示的垂直线构成容器问题,目标是找到两条线段,使它们与x轴构成的容器能容纳最多水。作者提供了计算面积的函数和主函数实现,强调了与滑动窗口算法的区别。
摘要由CSDN通过智能技术生成

题目

给定一个长度为 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

提示:

n == height.length

2 <= n <= 105

0 <= height[i] <= 104

思路

首先定义一个宏找最小,方便计算面积

然后写一个函数算面积

然后主函数写一个循环,双指针操作了一手

最后记得返回最大面积,,我第一次提交忘了

注意这个不是滑动窗口,因为尽管这段代码中的双指针技术在操作上看起来像是一个窗口在数组上滑动,但它的目的是为了寻找两条线段之间的最大面积,而不是为了维护满足特定条件的子数组。因此,这段代码更准确地被描述为使用双指针技术,而不是滑动窗口算法。

  1. 双指针技术:通常用于有序数组或链表,用来找到一对特定的元素。在这个问题中,我们使用双指针来找到可以形成最大面积的两个垂直线。两个指针分别从数组的两端开始,向中间移动,直到它们相遇。在每一步中,我们都会根据当前指向的两个线段来计算容器的面积,并更新最大面积。

  2. 滑动窗口算法:通常用于解决连续子数组或子字符串的问题,这些子数组或子字符串满足某种特定的条件。滑动窗口算法通过在数组或字符串上移动两个边界来维护一个窗口,这个窗口可以是固定或者动态变化的大小。滑动窗口算法的关键在于,窗口的移动通常是单向的,而且通常只需要线性时间就可以找到问题的解。

代码


#define MIN(x,y) ((x) < (y) ? (x) : (y))
int calculateArea(int x, int y, int width)
{
    if(x <= 0 || y <= 0 || width <= 0)
    {
        return 0;
    }
    else
    {
        return width * MIN(x,y);
    }
}

int maxArea(int* height, int heightSize) 
{
    int *head = height;
    int *tail = height + heightSize - 1;

    int maxArea = 0;
    int Area = 0;
    while(head != tail)
    {
        Area = calculateArea(*head, *tail, tail - head);
        if (Area > maxArea)
        {
            maxArea = Area;
        }
        
        if(*head <= *tail)
        {
            head ++;
        }
        else
        {
            tail --;
        }
    }
    return maxArea;
}

结果

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值