leetcode盛水最多的容器c++深度剖析【双指针篇】

盛水最多的容器

前言

对于程序员来说,必不可少的就是一定的算法能力,可以跟着小编一起学习题目的做题思路,培养算法能力,这里的双指针抽象为一种数组下标,更像是一种做题思路


文章目录

  • 盛水最多的容器
    • 前言
    • 题目解读
    • 算法思路
    • 编写代码
  • 总结

题目解读

查看原题请点击<—

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

leetcode盛水最多的容器c++深度剖析【双指针篇】_第1张图片

在做这个题目之前,首先我们需要了解一下木桶理论查看请点击<—

题目给定一个数组,数组中储存的是长度,两个数的长度与x轴围起来根据木桶原理可以构成一个容器求容器的最大体积是什么,由于是平面图,我们将体积看作面积,即求最大面积,低乘高,如示例一中的1和8,其围成的容积取决于短板1,即高为1乘他们之间的间距1,他们的容积就为1


算法思路

在了解了题目要求之后,那么我们就可以来进行构思这个题目的算法思路了

思路一:由于题目给定的数组中的元素是未经过排序的,我们这里不能够给他们进行排序去进行求解,因为这样他们之间原给定的间距就会被打乱,不符合题意

思路二:那么我们就不进行排序,分别定义变量指向数组的最左侧和最右侧,从两边开始进行计算

leetcode盛水最多的容器c++深度剖析【双指针篇】_第2张图片
计算1和7之间能储存多少水,即要计算1和7之间的间隔是多少,数一下得知,恰好就为其对应下标相减的结果,接着是计算1和7的高度,根据木桶原理,取决于其最短的那个数字1,所以就为1,将下标与高度进行相乘就为我们要求的容积,将求的容积进行比较放到变量里面,最后能留下来的就为最大值
同时,由于题目要求最大容积,根据木桶效应,我们计算完1和7的体积之后应该舍弃掉left和right指向的小的数,在1和7中即为1,这里可以举个例子,将1和7分别和8进行结合,1和8结合的高度为1,7和8结合的高度为7,求解体积肯定是7和8结合的体积要大,对应题目要求求最大的容积,显而易见,应该舍弃掉小的数1,让left向后走
leetcode盛水最多的容器c++深度剖析【双指针篇】_第3张图片
接着求出8和7对应的容积,并且与储存的变量进行比较,变量中留下最大值,这里的8和7由于题目要求最大容积,根据木桶效应,应该舍弃7,让right向前走
leetcode盛水最多的容器c++深度剖析【双指针篇】_第4张图片
这样依次进行循环,当left和right的时候相遇的时候就只剩下一个数了,一个数,那肯定不能够求容积,那我们就退出循环,变量中留下来的即为最大值

总结一下做题步骤

  • 1.求解体积
  • 2.将体积比较并且储存
  • 3.比较并且舍弃最小值

好了到这里,小编相信屏幕面前的你已经对这个题目的思路大体了解了,点击链接尝试做一下吧
查看原题请点击<—


编写代码

下面即为该题的代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0,right=height.size()-1,ret=0;

        while(left<right)
        {
            int volume=(right-left)*min(height[left],height[right]);
            ret=(max(ret,volume));

            if(height[left]>height[right]) right--;
            else left++;
        }

        return ret;
    }
};  

总结

以上就是今天的博客内容啦,水滴石穿,坚持就是胜利,读者朋友们可以点个关注
点赞收藏加关注,关注小编的后续更新!

你可能感兴趣的:(优选算法,leetcode,c++,算法)