博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode-第十一题Container With Most Water
阅读量:4136 次
发布时间:2019-05-25

本文共 1933 字,大约阅读时间需要 6 分钟。

题目链接

题目

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.

Note: You may not slant the container and n is at least 2.

题意理解和解答

很明显,第一种是蛮力算法,O(n^2)

class Solution {
//返回最大容积,这个求的时间复杂度是O(n^2)public: int maxArea(vector
& height) { int n=height.size(); int max_v=0; int temp=0; for(int i=0;i
max_v) max_v=temp; } } return max_v; }private:int min(int a,int b){ if(a>b) return b; else return a;}};

无需解释,也通不过,时间复杂度过高。

下面从网上找的一种O(N)的算法,着实精妙!

思路:

用两个指针分别指向a1到an的头和尾,然后计算a1和an围成的面积,之后比较height[i]和height[j],如果height[i]小,就把i指针向前移动i++,如果j小,就把j指针向前移动,j–,重新计算新的height[i]和height[j]组成的面积,直到i和j相遇,比较这n个面积的最大值,就是所要求的。

为哈?

哈哈,开始我也想了好久,看了网上的解答好久,终于想明白了这事。

下面用h[i]来表示height[i]。
这里写图片描述

自己想想想,这个算法能把n*(n-1)次计算面积简化成n次计算面积,一下子省略了这么多,肯定有窍门。

先看上图,假设某一次移动后如上。那么此时计算1和6组成的容器,很明显是下图:
这里写图片描述

之后比较h[i]和h[j],可以看出j应该–,跑到j+1位置处。

然后计算新的面积:
这里写图片描述

之后再次比较h[i]和h[j],j还–,跑到j+2处。

然后计算新的面积:
这里写图片描述

之后再次比较h[i]和h[j],i++,跑到i+1处。

然后计算新的面积:
这里写图片描述

这样我们可以一直比较下去计算面积,但是到这一步,先停下来想想,i从i到i+1,j从j到j+2,总共有6个组合,即(i,j),(i+1,j),(i,j+1),(i+1,j+1),(i,j+2),(i+1,j+2)。按照蛮力算法,应该计算6次面积,但是上面我们只计算了4次,省略了两次,现在再看看省略的两次:如下

2和6组成的面积

这里写图片描述
2和5组成的面积
这里写图片描述

仔细想想,省略的这两次有没有可能是这6次中最大的。答案:不可能

因为2和6的组合肯定没有1和6的组合大!

2和5的组合肯定没有1和5的组合大!(1高于2)
所以可以省略这两次比较。

现在我们只是比较了左边的两块和右边的三块,当把i增多,j也增多,就可以省略更多,这个需要慢慢体会。

所以上面提出的算法是可以理解的。

AC代码

class Solution {public:    int maxArea(vector
& height) { int max_c=0; int len=height.size(); int i=0,j=len-1; int container=0; while(true) { if(i==j) break; container=(j-i)*min(height[i],height[j]); if(container>max_c) max_c=container; if(height[i]
你可能感兴趣的文章
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
你准备写代码到多少岁?程序员们是这么回答的!
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
技术架构师的日常工作是什么?网友:搭框架,写公共方法?
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>
九度:题目1027:欧拉回路
查看>>
九度:题目1012:畅通工程
查看>>
九度:题目1017:还是畅通工程
查看>>
九度:题目1034:寻找大富翁
查看>>
第六章 背包问题——01背包
查看>>
第七章 背包问题——完全背包
查看>>
51nod 分类
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>