LeetCode-11.盛水最多的容器

这篇博客探讨了如何使用贪心算法解决一个经典的计算机科学问题——在给定高度的数组中找到能盛最多水的两个竖直边。作者首先尝试了暴力求解但导致超时,然后采用了双指针方法,从数组的两端开始,每次移动指向较矮边的指针,从而优化了时间复杂度。最终代码展示了如何通过这种方法有效地计算最大盛水量。

11.盛水最多的容器
来更新啦来更新啦
最近想要练习一下贪心,可能已开始只能学习代码,希望后面做多了自己可以写出来怀挺~

  • 题目描述

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

  • 代码
    这题感觉暴力肯定会超,let me try try
    奶思奶思,完美超时
class Solution {
public:
    int maxArea(vector<int>& height) {
        int max_volum = 0;
        for(int i = 0 ; i < height.size() - 1 ; i++){
            for(int j = i + 1 ; j < height.size() ; j++){
                int cur_volum = min(height[i],height[j]) * (j - i);
                if(cur_volum > max_volum)
                    max_volum = cur_volum;
            }
        }
        return max_volum;
    }
};

看了题解,使用双指针,官方说第一次可能想不到双指针,bingo!

使用双指针,i指向数组最左边,j指向最右边,每次计算结束后移动指针所指向数字最小的指针,详细见官方题解
官方题解

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max_volum = 0;
        int i = 0 ; int j = height.size() - 1;
        while(j > i){
            int cur_volum = min(height[i],height[j]) * (j - i);
            if(cur_volum > max_volum)
                max_volum = cur_volum;
            if(height[i] <= height[j])  
                i++;
            else
                j--;
        }
        return max_volum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值