由于之前对算法题接触不多,因此暂时只做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指针的位置有三种可能:

  1. 位于best_right位置左侧.这说明best_right位置已经被计算过,成立.
  2. 位于best_right位置,同上.
  3. 位于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
Container With Most Water

相关文章:

  • 2021-05-29
  • 2022-12-23
  • 2022-12-23
  • 2021-05-21
  • 2021-04-29
  • 2021-05-19
  • 2021-07-24
  • 2021-09-06
猜你喜欢
  • 2021-12-13
  • 2022-12-23
  • 2021-10-28
  • 2021-10-09
相关资源
相似解决方案