算法第七次作业
来源:互联网 发布:c语言获取网页内容 编辑:程序博客网 时间:2024/05/22 09:50
题目:
11. Container With Most Water
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)降到O(n)。
我们利用两个指针,一个从头开始,一个从尾部开始,每次都将高度较小的那个指针向另一个指针移动,直到两个指针重合这时面积是0。
为什么要移动高度较小的指针呢?因为你移动高度较大的指针,因为短板没变,两个指针距离减小,面积必然减小,那么移动高度较小的指针则又面积可能变得更大,其实这既是一种动态规划,又是一种贪心算法。
减少循环的核心思路是省去没有必要的遍历,并且确保所需的答案一定能被遍历到,
最后根据反证法可以证明不存在另一种方法能求得最大的面积。
代码:
class Solution {public: int min(int a, int b) { return (a>b)?b:a; } int maxArea(vector<int>& height) { vector<int>::iterator a,b; a=height.begin(); b=--height.end(); int area,maxarea=0; while(a!=b) { area=min(*a,*b)*(b-a); maxarea=(maxarea>area)?maxarea:area; if(*a>*b) b--; else a++; } return maxarea; }};
阅读全文
0 0
- 第七次算法作业
- 算法第七次作业
- 第七次作业
- 第七次作业
- 第七次作业
- 第七次上机作业
- 第七次课后作业
- 第七次作业
- 第七次作业
- 第七次作业
- 第七次java作业
- 第七次 HTML作业
- C++第七次作业
- c++第七次作业
- C++第七次作业
- 第七次C++作业
- c++第七次作业
- c++第七次作业
- C语言 婚礼上的谎言
- Spring 框架学习(二):Spring 应用配置文件讲解
- 机器学习实战(python)——kNN问题解析
- [BZOJ2049][SDOI2008]洞穴勘测(动态树LCT)
- Spring aop 原理及各种应用场景
- 算法第七次作业
- NYoj 16 矩形嵌套 (DAG上最长路
- Mybatis入门
- Java中类的单继承,接口的多继承
- Qt中的基本文件操作
- AttributeError: module 'tensorflow' has no attribute 'mul'
- SalesOrder 合同表一些SQL操作
- &>/dev/null 等价于 >/dev/null 2>&1
- 读取文本或者Excel的方法