探索 LeetCode 热题 HOT 100:破解 03 和 04
2023-09-18 13:23:07
揭秘 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. 算法学习有哪些建议?
算法学习需要扎实的理论基础,勤加练习,总结经验。建议先掌握基本算法原理,然后通过刷题和项目实战来提升技能。