LeetCode热门难题:两数之和与哈希表优化

需积分: 0 0 下载量 61 浏览量 更新于2024-06-30 1 收藏 1.85MB PDF 举报
LeetCode 热门题目HOT1001涉及了三个不同的编程挑战,分别是: 1. **两数之和**: 这是一道经典的数组问题,目标是在给定整数数组`nums`中找出两个数,它们的和等于目标值`target`。暴力枚举方法通过两层循环遍历数组,计算当前元素之和,检查是否与目标值匹配。使用哈希表(unordered_map)优化解题过程,将数组元素及其索引存储在哈希表中,查找`target - nums[i]`是否存在,如果存在则找到答案。这种方法的时间复杂度是O(n),因为哈希表的插入和查询操作都是常数时间。 ```cpp class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hash; for (int i = 0; i < nums.size(); i++) { if (hash.count(target - nums[i])) { return {hash[target - nums[i]], i}; } hash[nums[i]] = i; } return {}; } }; ``` 2. **两数相加**: 题目要求模拟加法过程,即在两个非降序整数链表`l1`和`l2`中,逐位相加并处理进位。遍历链表,将两个节点值相加并更新进位,将结果存入一个新的虚拟头结点`dummy`的链表中。此过程的时间复杂度同样是O(n),因为只需遍历一次链表。 3. **无重复字符的最长子串**: 这是一个字符串问题,通过双指针技术(两个指针i和j)来解决。维护一个哈希表`hash`记录字符及其出现次数,指针j每次向后移动,更新子串范围。当发现重复字符时,更新左指针i,跳过重复部分。这种方法的时间复杂度也是线性的,为O(n)。 这些题目都展示了哈希表在不同场景下的高效应用,无论是快速查找、去重还是计数,都是提高算法效率的重要工具。理解这些核心思想和代码实现对于提升编程能力和解决类似问题非常关键。在实际编程中,熟练掌握这些基础算法和数据结构能够让你在LeetCode等平台上的挑战中更游刃有余。