LeetCode:Container With Most Water 算法题详解
2015-06-20 12:24
393 查看
算法题目:Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
大致意思是:给定一个非负整数数组{a1,a2……,an},找到两个序号i,j,使用以ai,aj为高,以x轴为底所围成的容器可以容纳最多的水。
首先证明一个结论:假设找到的序号为i,j且i小于j,使用容器可以容纳最多的水,则不存在k,使得k大于j且ak>aj,和k小于i且ak>ai.
上述结论,很容易用反证法证明。
大致意思是:给定一个非负整数数组{a1,a2……,an},找到两个序号i,j,使用以ai,aj为高,以x轴为底所围成的容器可以容纳最多的水。
首先证明一个结论:假设找到的序号为i,j且i小于j,使用容器可以容纳最多的水,则不存在k,使得k大于j且ak>aj,和k小于i且ak>ai.
上述结论,很容易用反证法证明。
int maxArea(vector<int>& height) { //先将i,j设定为首尾 int i=0,j=height.size()-1; int maxS=0; while(j>i) { maxS=max(maxS,(j-i)*min(height[i],height[j]));//求最大容纳水量 if(height[i]<height[j])//若height[i]<height[j],则增大i,此时若减少j,没用,因为i的高度限定的容量的增大 { int k=i+1; while(k<j&&height[k]<height[i])k++; i=k; } else { int k=j-1; while(k>i&&height[k]<height[j])k--; j=k; } } return maxS; }
相关文章推荐
- Flex容器_Box_Label自动适应容器宽度问题
- Container With Most Water
- Red Hat Enterprise Linux 7部署Google容器管理工具Kubernetes
- Google容器管理工具Kubernetes简介
- Java进阶06 容器
- php 依赖注入容器(dependency injection container)
- 制作各种docker镜像
- Docker: the Linux container engine
- Xcode查看真机app沙盒内容
- 对docker container进行内核参数调优(tune)
- Kubernetes初探
- Flynn初探:基于Docker的PaaS平台
- Docker时代来了,你准备好了吗
- C++基础:C++标准库之map简介
- C++基础:C++标准库之set简介
- Docker简要操作
- LXC安装和配置(源码安装)
- CPP(二)再接再厉:STL容器类的使用
- Winstone 小型容器 注* v0.9.10
- Docker GUI调研