返回

刷题集锦:破解 LeetCode 上最棘手的难题

前端

引言

在算法和数据结构的领域,LeetCode 作为一个备受推崇的在线评判平台,为程序员提供了磨练技能和深入理解计算机科学基本原理的绝佳途径。通过解决一系列精心设计的难题,算法爱好者可以培养他们的逻辑思维、问题解决能力和编程技巧。

最长回文子串:动态规划的魅力

问题
给定一个字符串 s,找出 s 中最长的回文子串。

解题思路:
动态规划是一种自底向上的解题方法,特别适合解决最优化问题。在这个问题中,我们可以构建一个二维表 dp,其中 dp[i][j] 表示字符串 s[i:j] 的最长回文子串长度。通过逐步填充 dp 表,我们可以最终得到最长回文子串。

代码示例:

def longestPalindrome(s: str) -> str:
  n = len(s)
  dp = [[0] * n for _ in range(n)]

  start = 0
  max_len = 1
  for i in range(n - 1, -1, -1):
    dp[i][i] = 1
    for j in range(i + 1, n):
      if s[i] == s[j] and (j - i <= 2 or dp[i + 1][j - 1]):
        dp[i][j] = j - i + 1
        if dp[i][j] > max_len:
          max_len = dp[i][j]
          start = i

  return s[start: start + max_len]

贪心算法:区间合并的巧妙应用

问题:
给定一个包含区间列表的数组 intervals,合并所有重叠的区间。

解题思路:
贪心算法是一种基于局部最优解做出决策的解题方法。在这个问题中,我们可以先对区间按起始点排序,然后逐个合并重叠的区间。

代码示例:

def merge(intervals: List[List[int]]) -> List[List[int]]:
  intervals.sort(key=lambda x: x[0])

  merged = []
  for interval in intervals:
    if not merged or merged[-1][1] < interval[0]:
      merged.append(interval)
    else:
      merged[-1][1] = max(merged[-1][1], interval[1])

  return merged

二分查找:搜索算法的强大利器

问题:
给定一个有序数组 nums 和一个目标值 target,找出 target 在 nums 中的索引。如果 target 不存在,则返回 -1。

解题思路:
二分查找是一种高效的搜索算法,它通过不断缩小搜索范围来找到目标值。在这个问题中,我们可以将数组分成两半,然后根据 target 与中间值的比较结果来决定搜索哪一半。

代码示例:

def binarySearch(nums: List[int], target: int) -> int:
  left, right = 0, len(nums) - 1

  while left <= right:
    mid = (left + right) // 2
    if nums[mid] == target:
      return mid
    elif nums[mid] < target:
      left = mid + 1
    else:
      right = mid - 1

  return -1

结语

本文只是我对 LeetCode 刷题合集的一瞥,更多精彩难题和解法敬请关注我的后续文章。通过持续练习和探索算法的奥秘,你将不断提升自己的编程能力,为解决更复杂的计算机科学问题奠定坚实的基础。