LeetCode第11题盛最多水的容器C语言实现

LeetCode第11题盛最多水的容器C语言实现

leetcode原题地址
题目描述
在这里插入图片描述
示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

题解
1.暴力破解方法
把所有可能的结果求出来,返回最大的值,代码如下:

int maxArea(int* height, int heightSize)//height表示数组名,heightsize表示数组长度
{
    int  gao, chang;
    long mianji = 0;
    for(int i = 0; i < heightSize-1; i++){
        for(int j = i+1; j < heightSize; j++){
            gao = height[i]>height[j]? height[j]:height[i];
            chang = j-i;
            mianji = mianji>gao*chang? mianji:gao*chang;
        }
    }
    return mianji;
}

执行结果如下:
在这里插入图片描述

该算法时间复杂度为O(n^2)

2.双指针法

int maxArea(int* height, int heightSize)
{
    int i=0, j=heightSize-1, chang, gao;
    long mianji = 0;
    for(;i<j;)//从i=0第一个元素开始右移,j=heigttsize-1最后一个元素开始左移,i=j时退出循环
    {
        gao = height[i]>height[j]?height[j]:height[i];//水桶的短板效应,选短的
        chang = j-i;
        mianji = mianji>chang*gao?mianji:chang*gao;
        if(gao==height[i])//如果左边元素小于右边元素
            i++;//指向下一个元素
        else   //左边元素不小于右边元素
            j--;//指向前一个元素
    }
    return mianji;
}

运行结果如下:
在这里插入图片描述
该算法时间复杂为O(n)
双指针法总结:
从最左边一个元素和最右边一个元素向中间递归求面积,如果左边木板长度小于右边木板长度,则左边元素向后移一位,如果左边木板长度大于右边木板长度,则右边元素向前移一位(尽量选择两块木板长度相近且较长的的木板去组成木桶,而不需要关心木桶的底,也就是程序中的chang,因为至始至终,返回的结果都是最大的面积)。

mianji = mianji>changgao?mianji:changgao;

发布了1 篇原创文章 · 获赞 0 · 访问量 46

猜你喜欢

转载自blog.csdn.net/qq_41118887/article/details/104711918
今日推荐