博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Container With Most Water
阅读量:4955 次
发布时间:2019-06-12

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

Given n non-negative integers a1, a2, ..., a, 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.

 

The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

 

Example:

Input: [1,8,6,2,5,4,8,3,7]Output: 49

思路: 最左与最右分别设置两个点:l,r, 设它们的高为:hl,hr 先记录一次面积: area = (r-l)*min(hl,hr) 即为:两点间的距离*两者之间最矮的高度 假设在l,r原始点之内仍有可能存在更大的面积组合: 因为要往里找新的l,r组合,长度(r-l)是一直在缩小的,如果存在更大面积,则一定存在更长的高,则min(*hr,*hl)>min(hr,hl) 假设一开始,hr > hl, area = (r-l) * hl ;如果存在更大面积, 则*hl > hr, *area = (r-*l) * hr,因hr > hl, *area有可能会大于原面积      假设,hr < hl, area = (r-l) * hr ;如果存在更大面积, 则*hr > hl, *area = (*r-l) * hl, 因hl > hr, *area有可能会大于原面积 如果hl == hr 怎么办? 不断同时移动两个点,直到新的lr的高度同时大于原来的高度: 因为r-l一直在缩小,min(hl,hr)必须变大,所以hr,hl要同时变大才,有机会超越原来的面积。

class Solution(object):     def maxArea(self, height):         """         :type height: List[int]         :rtype: int         """         l,r = 0, len(height)-1         box = [self.getarea(height, l, r)]                  while l < r:             if l < r and height[l] < height[r]:                 l += 1                 if l < r and height[l] > height[l-1]:                     box.append(self.getarea(height, l, r))             if l < r and height[l] > height[r]:                 r -= 1                 if l < r and height[r] > height[r+1]:                     box.append(self.getarea(height, l, r))             if l < r and height[l] == height[r]:                 now = height[l]                 while l < r and now >= height[l]:                     l += 1                 while l < r and now >= height[r]:                     r -= 1                 box.append(self.getarea(height, l, r))         return max(box)                      def getarea(self, height, l, r):         return (r-l)*min(height[l], height[r])

转载于:https://www.cnblogs.com/phinza/p/11403385.html

你可能感兴趣的文章
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
MongoDB的简单使用
查看>>
hdfs 命令使用
查看>>
prometheus配置
查看>>
定宽320 缩放适配手机屏幕
查看>>
BZOJ 2120 数颜色 【带修改莫队】
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
Codeforces 40 E. Number Table
查看>>
CLR via C#(第3 版)
查看>>
java语法之final
查看>>
关于响应式布局
查看>>
详解ASP.Net 4中的aspnet_regsql.exe
查看>>
python 多进程和多线程的区别
查看>>
hdu1398
查看>>
[android] 网络断开的监听
查看>>
156.Binary Tree Upside Down
查看>>
MongoDB在windows下安装配置
查看>>
Upselling promotion stored procedure
查看>>
sigar
查看>>