C语言好题分享六(盛水最多的容器)

❀❀❀ 文章由@不准备秃的大伟原创 ❀❀❀

♪♪♪ 若有转载,请联系博主哦~ ♪♪♪

❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤

        盛水最多的容器

  题目来源LeetCode:刷题传送门

  简单来说就是要求水的体积最大值84d0f9c8e6aa45608a1662e7010d6ed0.png 

        算法一:暴力求解 

  无论做到什么题目,我们的尿性基本都是先暴力求解吧a6789b5537a94b13a77f906a2e4cb990.png,当然也不是不行,不过你看看这中等难度的题目,是你一个暴力求解就可以解决的吗?这世界上哪有这么好的题?!

  不过博主还是很宠粉滴~冒着超时的冒险给你们写了一下(时间复杂度: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;
}

19a5d7e207de40fcbeca4e82bb0dc8b3.png

  你看,果不其然超时了吧~ <(ˉ^ˉ)> 

  所以呢,我们需要一种新的方法,使其时间复杂度小于 O(N*N)

        算法二:双指针

  这个时候我们就需要分析了:

        我们可以用双指针的算法做:

  我们先设置一个res指向height的第一个元素,再设置一个des指向height的最后一个元素。然后我们从外面向里面找,这时候分两种情况,其实可以合并为一种情况:我们知道在找的过程中 底,也就是des - res 在一直减小,而 高,也就是height[des] 和 height[res] 其中的较小值可能会变化,这个时候我们就可以每次排除边界的一个较小的数,然后向内走,每次记录一个值,再与上一个值比较,这个值大就交换。

  gif示意(为其中一个例子):

4f3406f5f3714644951cebe981170f62.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制作不易,求个赞不过分吧 ヾ(^▽^*))) )!

7ff7a6640a7549e7be16145adbfb862f.jpeg

 

 

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大伟听风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值