LeetCode刷题2-11. 盛最多水的容器

题目链接:https://leetcode.cn/problems/container-with-most-water/

简单解法

  • 双层循环,用每一个数分别和其他数据算出一组值
  • 保留每个数据算出的该组值中的最大数
  • 所有数据对应的最大数进行比较,选出最大的即为解

简单解法代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        //双循环分别计算每组的乘积,用一个数组存储,数组大小为i,每组中用大的替换小的,之后将该数组大小进行比较 选出一个最大的 
        int num=height.size();
        int result[num];
        for(int i=0;i<num;i++){
            result[i]=0;
        }
        int temp,sum,max;
        for(int i=0;i<height.size();i++){
            for(int j=i+1;j<height.size();j++){
                temp=height[i]>height[j]?height[j]:height[i];
                sum=temp*(j-i);
                if(sum>result[i]){
                    result[i]=sum;
                }
            }
        }
        max=result[0];
        for(int i=1;i<height.size();i++){
            if(result[i]>max)
                max=result[i];
        }
        return max;
    }
};

简单解法结果

在这里插入图片描述
由于代码时间复杂度为O(n2),故遇到n比较大时会出现超时错误

算法改进-双指针实现

算法概述

  • 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽底边宽度 −1变短:
  • 若向内 移动短板 ,水槽的短板可能变大,因此下个水槽的面积可能增大 。
  • 若向内 移动长板 ,水槽的短板不变或变小,因此下个水槽的面积一定变小 。
  • 因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

算法参考:
作者:Krahets
链接:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码(原创):

class Solution  {
public:
    int maxArea(vector<int>& height) {
        int front=0;
        int rear=height.size()-1;
        int result=0,max=0,temp;
        while(front!=rear){
            temp=height[front]<height[rear]?height[front]:height[rear];
            result=temp*(rear-front);
            if(result>max)
                max=result;
            //每次移动短的,才会出现更大的面积
            if(height[front]<height[rear]){
                front++;
            }else{
                rear--;
            }
        }
        return max;
    }
};

改进后结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值