返回

探索 LeetCode 热题 HOT 100:破解 03 和 04

Android

揭秘 LeetCode HOT 100 题组中的两颗算法明珠

在算法学习者的征途上,LeetCode HOT 100 题组犹如一座巍然屹立的高峰,吸引着无数求知若渴的探索者。在这片算法的海洋中,03 和 04 两道经典题目更是熠熠生辉,犹如两颗璀璨的明珠,照亮着算法学习之路。

03. 无重复字符的最长子串

题意:

给定一个字符串,找出其中不包含重复字符的最长子串。

解题思路:

这道题考验的是滑动窗口算法的应用。我们使用两个指针 left 和 right,维护一个窗口。从左到右遍历字符串,当遇到重复字符时,将 left 指针移动到重复字符的下一个位置,同时维护窗口中字符的唯一性。在这个过程中,我们记录窗口中字符最多的情况,最终返回这个最长不重复子串的长度。

def length_of_longest_substring(s):
  left, right = 0, 0
  seen = set()
  max_length = 0

  while right < len(s):
    if s[right] not in seen:
      seen.add(s[right])
      max_length = max(max_length, right - left + 1)
      right += 1
    else:
      seen.remove(s[left])
      left += 1

  return max_length

04. 寻找两个有序数组的中位数

题意:

给定两个已排序的数组,找出两个有序数组的中位数。

解题思路:

这道题是二分搜索算法的经典应用。我们先计算合并后数组的总长度,然后找到合并后数组中位数的索引。由于数组已排序,我们可以利用二分搜索在两个数组中快速定位中位数的左右元素,最终得到中位数或中位数的平均值。

def find_median_sorted_arrays(nums1, nums2):
  total_length = len(nums1) + len(nums2)
  mid = total_length // 2

  left, right = 0, len(nums1) - 1
  while left <= right:
    mid_nums1 = left + (right - left) // 2
    mid_nums2 = mid - mid_nums1 - 1

    if nums1[mid_nums1] <= nums2[mid_nums2]:
      left = mid_nums1 + 1
    else:
      right = mid_nums1 - 1

  if total_length % 2 == 0:
    if mid_nums1 == len(nums1):
      return (nums2[mid_nums2] + nums2[mid_nums2 + 1]) / 2
    elif mid_nums2 == len(nums2):
      return (nums1[mid_nums1] + nums1[mid_nums1 + 1]) / 2
    else:
      return (nums1[mid_nums1] + nums2[mid_nums2]) / 2
  else:
    if mid_nums1 == len(nums1):
      return nums2[mid_nums2]
    elif mid_nums2 == len(nums2):
      return nums1[mid_nums1]
    else:
      return max(nums1[mid_nums1], nums2[mid_nums2])

总结

03 和 04 题目的深入剖析,带领我们领略了滑动窗口算法和二分搜索算法的魅力。这两道题目看似复杂,但通过对算法原理的理解和巧妙运用,我们可以将其攻克。在算法学习的道路上,除了掌握算法知识外,不断练习和总结经验也至关重要。让我们一起继续探索算法的奥秘,在解题的道路上不断攀登新的高峰。

常见问题解答

1. 如何选择合适的算法来解决问题?

选择算法需要考虑问题的具体特征和算法的适用范围。对于无重复字符的最长子串问题,滑动窗口算法能够高效地维护子串的唯一性,而对于寻找两个有序数组的中位数问题,二分搜索算法能够快速定位中位数。

2. 为什么滑动窗口算法能够保证无重复字符?

滑动窗口算法在每次遇到重复字符时,都会移动 left 指针到重复字符的下一个位置,从而有效地将重复字符排除在窗口之外。

3. 为什么二分搜索算法能够快速找到中位数?

二分搜索算法利用了有序数组的特性,通过不断缩小搜索范围,快速定位中位数的索引。

4. 除了滑动窗口算法和二分搜索算法,还有哪些常用的算法?

其他常见的算法包括贪心算法、动态规划算法、回溯算法、分治算法等,每种算法都有其独特的适用场景。

5. 算法学习有哪些建议?

算法学习需要扎实的理论基础,勤加练习,总结经验。建议先掌握基本算法原理,然后通过刷题和项目实战来提升技能。