储存最大水量

文章介绍了如何使用双指针法解决一个IT技术问题,即在给定的一组线段中找到两个线段,使得它们与x轴构成的容器能容纳最多水量。通过逐步收窄水槽,每次都选择较短线段靠近中心,最终实现O(n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个长度为 n的整数数组height,有n条垂线,第i条线的两个端点是(i,0)和(i,height[i]).

找出其中两条线,使得他们与x轴共同构成的容器可以容纳更多的水。

返回容器不倾斜的前提下可以储存的最大水量。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//暴力法,大概就是冒泡排序的思想
//这题多少沾点 这个方法复杂度太高过不了
int test1(int* height, int heightSize)
{
    int sum = 0;
    int left = 0;
    int right = 1;
    for (left = 0; left < heightSize - 1 ;left++)
    {
        for (right = heightSize - 1; right > left; right--)
        {
            if ((height[left] * (right - left) > sum) && (height[right] * (right - left) > sum))
            {
                if (height[left] > height[right])
                    sum = height[right] * (right - left);
                else
                    sum = height[left] * (right - left);
            }
        }
    }
    return sum;
}


//在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1-1−1​ 变短:

//若向内 移动短板 ,水槽的短板 min(h[i], h[j])min(h[i], h[j])min(h[i], h[j]) 可能变大,因此下个水槽的面积 可能增大 。
//若向内 移动长板 ,水槽的短板 min(h[i], h[j])min(h[i], h[j])min(h[i], h[j])​ 不变或变小,因此下个水槽的面积 一定变小 。
//
//因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
//算法流程:
//
//初始化: 双指针 iii, jjj 分列水槽左右两端;
//循环收窄: 直至双指针相遇时跳出;
//更新面积最大值 sum ;
//选定两板高度中的短板,向中间收窄一格;
//返回值: 返回面积最大值 sum即可
//这样的时间复杂度是O(n)
int test2(int* height, int heightSize)
{
    int sum = 0;
    int left = 0;
    int right = heightSize-1;
    while (left <= right)
    {
        if (height[left] < height[right])
        {
            if (sum < height[left] * (right - left))
                sum = height[left] * (right - left);
            left++;
        }
        else
        {
            if (sum < height[right] * (right - left))
                sum = height[right] * (right - left);
            right--;
        }
    }
    return sum;
}



int main()
{
    int height[100] = { 1, 9, 6, 2, 5, 4, 8, 9, 7 };
    /*printf("%d", sizeof(height) / sizeof(int));*/
    int heightSize = 9;
    //int sum = test1(height, heightSize);
    int sum = test1(height, heightSize);
    printf("%d", sum);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值