返回

解锁LeetCode T11和T20:盛最多水的容器与有效的括号

前端

利用贪心算法征服 LeetCode 经典难题

什么是贪心算法?

贪心算法是一种求解问题的方法,它在每次决策时都做出局部最优选择,从而逐步逼近全局最优解。虽然贪心算法不能保证在所有情况下都得到最优解,但它通常能在相对较短的时间内找到较好的解决方案。

贪心算法解决 LeetCode T11:盛最多水的容器

问题背景:

给定一个柱状图,其中每个柱子的宽度为 1,求出在柱状图中可以盛放多少水。

解决方案:

我们可以使用贪心算法解决这个问题。首先,我们将两个指针指向柱状图的开头和结尾。然后,我们比较两个指针指向的柱子的高度,并将较短的柱子向内移动。每次移动,我们计算在两个指针之间可以盛放的水量,并更新最大盛水量。

代码示例:

def maxArea(height):
    max_area = 0
    left, right = 0, len(height) - 1
    while left < right:
        area = (right - left) * min(height[left], height[right])
        max_area = max(max_area, area)
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1
    return max_area

贪心算法解决 LeetCode T20:有效的括号

问题背景:

给定一个只包含括号 (){}[] 的字符串,判断该字符串是否有效。

解决方案:

我们可以使用贪心算法解决这个问题。首先,我们将栈初始化为空。然后,我们遍历字符串中的每个字符,并将左括号压入栈中。当我们遇到一个右括号时,我们将栈顶的左括号弹出。如果栈顶的左括号与当前的右括号不匹配,则字符串无效。如果我们遍历完字符串后,栈为空,则字符串有效。

代码示例:

def isValid(s):
    stack = []
    brackets = {')': '(', '}': '{', ']': '['}
    for char in s:
        if char in brackets.values():
            stack.append(char)
        elif char in brackets.keys():
            if not stack or stack.pop() != brackets[char]:
                return False
    return not stack

结论

贪心算法是一种强大的工具,可以帮助我们在 LeetCode 中解决许多问题。通过了解贪心算法的原理和应用,我们可以显著提高我们的问题解决能力和编程技巧。

常见问题解答

  1. 贪心算法总是能找到最优解吗?

不,贪心算法不能保证在所有情况下都找到最优解。但是,它通常能找到较好的解决方案。

  1. 贪心算法适用于哪些问题类型?

贪心算法适用于局部最优选择可以逐步逼近全局最优解的问题。

  1. 除了 LeetCode T11 和 T20 之外,贪心算法还可以解决哪些 LeetCode 问题?

贪心算法还可以解决许多其他 LeetCode 问题,例如:

  • T560:和为 K 的子数组
  • T135:分发糖果
  • T122:买卖股票的最佳时机 II
  1. 如何提高贪心算法的效率?

我们可以通过使用数据结构(如栈、队列或集合)来优化贪心算法,从而提高其效率。

  1. 贪心算法在现实世界中有哪些应用?

贪心算法在现实世界中有许多应用,例如:

  • 资源分配
  • 路径规划
  • 数据压缩