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;
标签:11,int,元素,height,gao,题盛,mianji,C语言,chang 来源: https://blog.csdn.net/qq_41118887/article/details/104711918