leetcode - Container With Most Water
题目链接:http://oj.leetcode.com/problems/container-with-most-water/
第一个解法是用两个数组双向记录。方法的时间复杂度是O(n+max)。这里的max是height的最大值。当时没有想到用双向遍历的方法去做。【貌似第一遍leetcode中还从来没有用过双向遍历】
1 class Solution { 2 public: 3 int maxArea(vector<int> &height) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int max=-1; 7 int * ar; 8 int n = height.size(); 9 ar = new int[n]; 10 vector<int>::iterator ii; 11 int i=0; 12 for (ii= height.begin(); ii!=height.end();ii++, i++){ 13 if (*ii>max) 14 max = *ii; 15 ar[i] = *ii; 16 } 17 int * f, *g; 18 f = new int[max+1]; 19 g = new int [max+1]; 20 for (i=0; i<=max; i++){ 21 f[i]=-1; 22 g[i]=-1; 23 } 24 int j; 25 for (i=0; i<n; i++){ 26 j = ar[i]; 27 while(j>=0 && f[j]==-1){ 28 f[j] = i; 29 j--; 30 } 31 } 32 for (i=n-1; i>=0; i--){ 33 j = ar[i]; 34 while (j>=0 && g[j]==-1){ 35 g[j] = i; 36 j--; 37 } 38 } 39 int area = 0; 40 for (i=0; i<n; i++){ 41 if (g[ar[i]]>i){ 42 int ta = (g[ar[i]]-i)*ar[i]; 43 if (ta>area) 44 area = ta; 45 } 46 } 47 for (i=n-1; i>=0; i--){ 48 if (f[ar[i]]<i){ 49 int ta = (i-f[ar[i]])*ar[i]; 50 if (ta>area) 51 area = ta; 52 } 53 } 54 delete []ar; 55 delete []f; 56 delete []g; 57 return area; 58 } 59 };
双向遍历的算法倒是很简单:
1 class Solution { 2 public: 3 int maxArea(vector<int> &height) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int l=0, r = height.size()-1; 7 int area = 0; 8 while (l<r){ 9 int t = (r-l)*min(height[l], height[r]); 10 if (t>area) 11 area = t; 12 if (height[l]<height[r]) 13 l++; 14 else r--; 15 } 16 return area; 17 } 18 };
不仅复杂度降为O(n),代码量更是大大的少了。
至于证明。你懂的。
转载于:https://www.cnblogs.com/zhanghs/archive/2013/03/26/2983624.html
leetcode - Container With Most Water相关推荐
- [leetcode] Container With Most Water
思路:最大面积等于两条垂直线中较小的一条乘以与x轴相交的长度,可以使用Two Pointers,一个从数组头开始(记为i),一个从数组尾部开始(记为j),当i < j时,一直循环找最大面积,如果 ...
- 【贪心+双指针】LeetCode 11. Container With Most Water
LeetCode 11. Container With Most Water Solution1: 参考网址:http://www.cnblogs.com/grandyang/p/4455109.ht ...
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain Water Given ...
- LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...
- 【重点:BFS】LeetCode 407. Trapping Rain Water II
LeetCode 407. Trapping Rain Water II 博客转载自:http://www.cnblogs.com/grandyang/p/5928987.html [太难了,被智商碾 ...
- 【重点:DP 双指针 栈】LeetCode 42. Trapping Rain Water
LeetCode 42. Trapping Rain Water 本博客转载自:http://www.cnblogs.com/grandyang/p/4402392.html [自己又不会做,抄的-& ...
- Container with most water(盛水最多的容器)
Container with most water(盛水最多的容器) 简单的证明 如图 题目: 给定 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n ...
- LeetCode 42 Trapping Rain Water 收集雨水
LeetCode 42 Trapping Rain Water 收集雨水 Given n non-negative integers representing an elevation map whe ...
- Leetcode 407. Trapping Rain Water II 收集雨水2 解题报告
1 解题思想 我看了下题目,发现比预想中的简单,加之我比较烂,所以其实我还是没做,只是看懂了上回贴的代码,然后做了一下注释,现在我来讲下题目. 首先请看下上一题,上一题是2D的这题是3D的: Leet ...
最新文章
- 绩效真的重要吗?绩效管理系统有哪些?
- 通过小故事,了解多一点何谓 Node 高性能
- Linux学习之获取帮助
- 模拟集成电路的经典教材
- android 开启wifi失败,[求助]获取基站/wifi信息为空或失败
- 荣耀鸿蒙系统开机动画,荣耀赵明:鸿蒙系统首发设备欲屏蔽开机广告
- UVALive 6511 Term Project
- python决策树原理_关于决策树算法最通俗的一次Python学习教程,你肯定得看
- JSP 获取访问者真正的IP地址
- 8 个最好的 jQuery 树形 Tree 插件
- 开课吧课堂之未被捕获的异常
- 韩立刚计算机网络笔记-第04章 数据链路层
- 三星内存编码_想问一下三星内存条的型号有什么区别
- Windows Server 2012开机账户自动登录
- 【PS专题】PS钢笔压力有感叹号怎么消除
- Matter协议特性解析(一) 支持非Matter协议,私有协议,Matter Bridge技术分析
- pdf转换成jpg转换器教程
- 「分布式系统之美」知乎圆桌精选大放送第二期|不要放过任何你感兴趣的话题
- 用php编写多项选择题_php 多选框问题(类似一道多选题)多选题的答案 以及正确答案都记录到数据库里了,读取修改问题...
- open-api-project
热门文章
- 模态对话框和非模态对话框的消息循环
- 【数据平台】同一mysql主机不同数据库建复制表
- tensorflow 添加官方代码--以leaky_relu为例
- opencv像素基本操作及图像遍历at
- python 求均值_数据分析:寻找Python最优计算性能
- python逐行读取json_如何用python读取json文件里指定的数据
- Take a Field Service Journey
- MyBatis是持久化层框架(SQL映射框架)-操作数据库
- Java的知识点27——打印子孙级目录和文件的名称、统计文件夹的大小、编码与解码的应用
- java的知识点17——java.util.Arrays类、多维数组