由于之前对算法题接触不多,因此暂时只做easy和medium难度的题.
看完了《算法(第四版)》后重新开始刷LeetCode了,这次决定按topic来刷题,有一个大致的方向.有些题不止包含在一个topic中,就以我自己做的先后顺序为准了.
Array
---11.Container With Most Water
给定许多条与y轴平行的直线,求其中两条直线与x轴围成的容器的最大容量.
这道题用到了双指针的思想.我们在数轴的两端分别放置一个left指针和right指针,因为容器容量=较短边*两边位置之差,所以如果移动较大的那个指针,那么容量必定在减小.因此我们不断往中间移动较小的指针才有可能使容量变大,直到两指针相遇为止.
对于算法合理性的逻辑推理:我们假设在best_left和best_right位置取到最大容量,那么left指针到达best_left位置或right指针到达best_right位置至少有一种会发生.不妨令left指针到达best_left位置,此时right指针的位置有三种可能:
- 位于best_right位置左侧.这说明best_right位置已经被计算过,成立.
- 位于best_right位置,同上.
- 位于best_right位置右侧.因为left指针移动的条件是right指针所在边大于left指针所在边,如果符合此条件,且right指针在best_right右侧,那么当前容量一定大于假设中的最大容量,与假设矛盾.所以left指针必定会一路移动至best_right位置.
class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ left = 0 right = len(height) - 1 most = 0 while left != right: h = min(height[left], height[right]) most = max(most, h * (right - left)) if height[left] < height[right]: left += 1 else: right -=1 return most Container With Most Water