❀❀❀ 文章由@不准备秃的大伟原创 ❀❀❀
♪♪♪ 若有转载,请联系博主哦~ ♪♪♪
❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤
盛水最多的容器
题目来源LeetCode:刷题传送门
简单来说就是要求水的体积最大值
算法一:暴力求解
无论做到什么题目,我们的尿性基本都是先暴力求解吧,当然也不是不行,不过你看看这中等难度的题目,是你一个暴力求解就可以解决的吗?这世界上哪有这么好的题?!
不过博主还是很宠粉滴~冒着超时的冒险给你们写了一下(时间复杂度:O(N*N)):
int maxArea(int* height, int heightSize) {
int max = 0;
int m = 0;
for(int i = 0; i < heightSize; i++)
{
for(int j = i + 1; j < heightSize; j++)
{
max = (j - i) * fmin(height[i],height[j]);
if(max > m)
m = max;
}
}
return m;
}
你看,果不其然超时了吧~ <(ˉ^ˉ)>
所以呢,我们需要一种新的方法,使其时间复杂度小于 O(N*N)
算法二:双指针
这个时候我们就需要分析了:
我们可以用双指针的算法做:
我们先设置一个res指向height的第一个元素,再设置一个des指向height的最后一个元素。然后我们从外面向里面找,这时候分两种情况,其实可以合并为一种情况:我们知道在找的过程中 底,也就是des - res 在一直减小,而 高,也就是height[des] 和 height[res] 其中的较小值可能会变化,这个时候我们就可以每次排除边界的一个较小的数,然后向内走,每次记录一个值,再与上一个值比较,这个值大就交换。
gif示意(为其中一个例子):
接下来开始写代码(时间复杂度为O(N))(fmin为库函数,求两个数的较小数):
int maxArea(int* height, int heightSize) {
int res = 0;
int des = heightSize - 1;
int V = 0;
int v = (des - res) * fmin(height[res],height[des]);//先给v初始化为最两侧的大小
while(res < des)
{
if(height[res] >= height[des])
{
V = (des - res) * height[des];
des--;//严格按照算法进行,情况一
}
else
{
V = (des - res) * height[res];
res++;//情况二
}
if(V > v) v = V;
}
return v;//返回最大的值
}
兄弟们可能看着代码简单,挺容易理解的,但是想到这个算法可确实很难。就像有些中等题,难题,想到了方法后再去实现就会发现很简单。
Sharp tools make good work. ————工欲善其事,必先利其器。
那么本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷(另外gif制作不易,求个赞不过分吧 ヾ(^▽^*))) )!