首页 > 其他分享 >盛水最多的容器

盛水最多的容器

时间:2023-06-18 23:44:33浏览次数:25  
标签:容器 begin temp 盛水 int max height length

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

 

 

乍一看几乎没啥思路,不过把题目抽象一下,不就是求一个长方形的面积吗?而且这个长方体的长和高都是动态的,且高是左右两边最小的那一个。

那么最粗暴的解法就有了,从nums[0]开始算,求nums[0]~nums[i]组成的面积,长是i-0,高是min{nums[0],nums[i]},i表示数组下标

之后从num[1],nums[2].......计算,最后找到最大的那个就行

不过这样对于算法肯定是不行的,因为要算的面积太多了。

 

所以思考一下怎么减少计算量??长度每次都会递增1,高度不确定?

想一下,找个数组里面最小的数,那么它组成的所有长方形的高肯定就是它本身,因此找离它最远的那个数组成长方形,这就是它的最大容量。

 之后找第二小的数(此时就不用考虑比和它小的数组成的长方形的面积了),找第二小的数的最大面积长方形,

之后找第三找第四.......找到最大数后停止,计算量好像减少了很多。

这么看来就很清晰了,只要对数组内的每个数找比它高且离它最远的那个就好了,之后选里面最大的那个。

class Solution {
public:
    int maxArea(vector<int>& height) {
int max=0;

for(int i=0;i<height.size();i++)
{
  int length=0;

    for(int j=0;j<height.size();j++)
    {
        if(j!=i)
        {
            if(height[j]>height[i]||height[j]==height[i])
            {
                int length_temp=abs(j-i);
                length=length>length_temp?length:length_temp;
            }
        }
    }
    int max_temp=length*height[i];
    max=max>max_temp?max:max_temp;
}

return max;
    }
};

超时!!果然O(N2)根本不行。 不过优化一下试试:

class Solution {
public:
    int maxArea(vector<int>& height) {
int max=0;

for(int i=0;i<height.size();i++)
{
  int length=0;
  if(i<height.size()/2)
  {
    for(int j=height.size()-1;j>0;j--)
    {
        if(height[j]>height[i]||height[j]==height[i])
        {
            length=abs(j-i);break;
        }
    }
  }
  else
  {
      for(int j=0;j<height.size();j++)
    {
        if(height[j]>height[i]||height[j]==height[i])
        {
            length=abs(j-i);break;
        }
    }
  }
max=max>length*height[i]?max:length*height[i];
}

return max;
    }
};

勉强能跑,因为优化了寻找最长边的循环条件,前一半的数从末尾找,后一半的数从前面找;

 但明显这样的解法不好。而且题目是关于双指针的,怎么用双指针达成O(N)的复杂度呢??

 

上面我是找每个高对应的最长边求最大面积,要找两次,先找高,再找边。反过来,我直接从最长的边开始找,直接就确定了高不是吗?这不就只用遍历一次吗?

思考一下,最长的边肯定是首尾这两个数组成的,用begin和end标记下。begin=0;end=n;(n表示数组的长度-1,end-begin就是边长) ;

 它的高度是这俩小标对应的最小的那个数,所以面积也确定了,之后缩小边(因为边只能1单位1单位的减少)再找高。

问题是,从左侧还是右侧的地方往里缩小呢??

根据题目,是要找最大的面积,我期望缩小后的这个面积是比原来大的,假如我从高处缩小,肯定不行,期望面积在减小,不行,所以只能从低处往里缩小,这样期望面积才有可能变大。

如此一来,题解就有了。

代码如下:

class Solution {
public:
    int maxArea(vector<int>& height) {
int begin=0;
int end=height.size()-1;
int max=0;
int l=0;
int h=0;
while(begin<end)
{
    l=end-begin;
if(height[begin]<height[end]||height[begin]==height[end])
{
    h=height[begin];
}
else
{
    h=height[end];
}
max=max>l*h?max:l*h;

if(h==height[begin])
{
begin++;
}
else end--;

}
return max;
    }
};

 

标签:容器,begin,temp,盛水,int,max,height,length
From: https://www.cnblogs.com/HaveFunnyAnyone/p/17490038.html

相关文章

  • k8s 深入篇———— 一些容器操作的原理[三]
    前言简单介绍一下一些容器的操作原理。正文dockerexec是怎么做到进入容器里的呢。比如说:这里有一个容器,我们可以exec进去:dockerexec-itb265/bin/sh我们为什么能看到和容器内部一样的场景呢?首先我们知道了为什么容器进程只能看到规定的namespace了,那么如果我们......
  • linux学习笔记(31)容器
    【1】容器的介绍(1.1)基本概念容器:针对应用(服务)所需的运行环境,比如依赖、目录、网络、用户等整体封装的技术。封装好的应用(服务)环境叫做镜像,可以理解成迷你版虚拟机或者豪华软件包。当前大多数镜像,是软件厂商自己封装好的,我们直接下载使用即可。如:nginx。核心三个......
  • STL vector容器存储键值对
    在阅读tvm源码时,发现了一个挺有意思的代码:std::vector<std::pair<std::string,ObjectRef>>update;vector容器里竟然存储的是键值对,amazing啊!!!还是第一次遇到这种写法的,这与直接写成map有啥不一样呢?首先,这两种方式都可以用于存储键值对,只是它们具有不同的特性和实用场景。s......
  • Dagonfly 镜像分发:提高容器部署效率的利器
    随着容器技术的快速发展,越来越多的企业和开发者开始将应用程序打包成容器镜像,并使用容器编排工具进行部署和管理。然而,随着容器数量的增加,容器镜像的分发和部署效率成为一个挑战。在这种情况下,Dagonfly镜像分发技术应运而生。Dagonfly是一个开源的镜像分发系统,旨在提供高效、稳......
  • 镜像,容器,容器数据卷,DockerFile 相关命令 使用总结
    镜像,容器,容器数据卷,DockerFile相关命令使用总结镜像是1种轻量级、可执行的独立的软件包。包含:代码,运行时,库,环境变量和配置文件。所有软件包,直接打包docker镜像,就可以直接跑起来.独立的运行环境。一.镜像命令1.列出本机所有镜像,查看镜像dockerimages2.搜索镜像dockersearc......
  • 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器
    专栏简介本专栏将带领您进入Docker的世界。您是否对Docker有所耳闻?那么,您是否知道使用Docker可以带来什么样的好处呢?如果您还不了解Docker,不用担心,让我们一起探索这个神奇的世界吧!DockerDocker最初是dotCloud公司内部项目,由SolomonHykes在法国创立。它基于dotCloud公司多年......
  • Docker容器添加映射端口
    一般在运行容器时,都会通过-p来指定宿主机和容器端口的映射,例如:dockerrun-itd-p本地端口:容器内端口所用镜像名参数说明-d表示后台运行容器-t为docker分配一个伪终端并绑定到容器的标准输入上-i是让容器的标准输入保持打开状态-p指定映射端口即创建容器时,可以设置一个......
  • CKS 考试题整理 (13)-使用 sysdig 检查容器里里的异常进程
    Task使用运行时检测工具来检测Podtomcat单个容器中频发生成和执行的异常进程有两种工具可供使用:sysdigfalco注:这些工具只预装在cluster的工作节点,不在master节点。 使用工具至少分析30秒,使用过滤器检查生成和执行的进程,将事件写到/opt/KSR00101/incidents/summ......
  • CKS 考试题整理 (11)-沙箱运行容器gVisor
    Context该cluster使用containerd作为CRI运行时。containerd的默认运行时处理程序是runc。containerd已准备好支持额外的运行时处理程序runsc(gVisor)。 Task使用名为runsc的现有运行时处理程序,创建一个名为untrusted的RuntimeClass。更新namespaceserver中的所有Pod......
  • CKS 考试题整理 (05)-容器安全,删除特权pod
    context检查在namespaceproduction中运行的Pod,并删除任何非无状态或非不可变的Pod。task使用以下对无状态和不可变的严格解释:能够在容器内存储数据的Pod的容器必须被视为非无状态的。注意:你不必担心数据是否实际上已经存储在容器中。被配置为任何形式的特权Po......