题目简介:
这里对题目作进一步形式化定义,给定一组非负整型数,题目希望找到两个数字
,使得目标函数
最小。
举例说明:输入一组非负整型数 [1,8,6,2,5,4,8,3,7]
由上图可知,每个数字表示柱子的高度,题目希望找到两个柱子可以装下尽可能多的水。
解法一:
按照惯例,解法一般是暴力解法,可惜python的循环效率实在是低了点,整型数一多,两重循环就直接超时了。但思路还是可以了解一下,遍历所有的整型数对,总共需要遍历作
次。
解法二:两指针法
在采用解法二之前,小天尝试过很多方法将复杂度降至,但大多是不可行的。其实,这道题虽然可以被形式是一道最优化题,但实际上还是一道搜索题。解法二中初始化两个指针分别指向数组的两端,然后判断两指针多所指向的整型数,舍弃较小数,将其指针往里移动。因为每次只移动一个指针,故而时间复杂度降低至
。
官网给出非常详细的解释,因为初始化条件下,所占长度是最长的。左右两边无论哪一边向内移动,占用长度上都是相同的,那只需要决策出那种移动更有利即可。另一方面,可容纳的水量受到较短高度的限制,每次舍去较短长度可以增加限制。
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
n, m = 0, len(height) - 1
max_area = 0
while n < m:
max_area = max(max_area, min(height[n], height[m]) * (m - n))
if height[n] > height[m]: m -= 1
else: n += 1
return max_area
总结:
LeetCode上的题目大多从真实的项目中抽象出来,非常适合练手。