题目解析
题目选择
我们选择豆包MarsCode AI 刷题题库中的一道经典题目: “两数之和” 。
题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例
输入: nums = [2, 7, 11, 15], target = 9
输出: [0, 1]
解释: nums[0] + nums[1] = 2 + 7 = 9
思路解析
-
暴力解法:
- 最简单的方法是使用两层循环,遍历数组中的每一对元素,检查它们的和是否等于
target。时间复杂度为 O(n^2)。
- 最简单的方法是使用两层循环,遍历数组中的每一对元素,检查它们的和是否等于
-
哈希表优化:
- 使用哈希表(
HashMap)来存储数组中的元素及其对应的索引。遍历数组时,检查target - nums[i]是否在哈希表中。如果在,则找到了答案;如果不在,则将当前元素及其索引存入哈希表。时间复杂度为 O(n)。
- 使用哈希表(
图解
nums = [2, 7, 11, 15], target = 9
- 初始化哈希表 map = {}
- 遍历数组 nums:
- 对于 nums[0] = 2:
- 计算 complement = target - nums[0] = 9 - 2 = 7
- 检查 7 是否在 map 中:
- 不在,将 (2, 0) 存入 map
- 对于 nums[1] = 7:
- 计算 complement = target - nums[1] = 9 - 7 = 2
- 检查 2 是否在 map 中:
- 在,返回 [map.get(2), 1] = [0, 1]
- 对于 nums[0] = 2:
代码详解
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] twoSum(int[] nums, int target) {
// 创建一个哈希表来存储数组中的元素及其索引
Map<Integer, Integer> map = new HashMap<>();
// 遍历数组
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
// 检查 complement 是否在哈希表中
if (map.containsKey(complement)) {
// 如果在,返回对应的索引
return new int[] { map.get(complement), i };
}
// 如果不在,将当前元素及其索引存入哈希表
map.put(nums[i], i);
}
// 如果没有找到答案,返回空数组(题目保证有解)
return new int[] {};
}
}
题目解析
题目选择
我们选择豆包MarsCode AI 刷题题库中的一道经典题目:“两数之和”。
题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例
输入: nums = [2, 7, 11, 15], target = 9
输出: [0, 1]
解释: nums[0] + nums[1] = 2 + 7 = 9
思路解析
-
暴力解法:
- 最简单的方法是使用两层循环,遍历数组中的每一对元素,检查它们的和是否等于
target。时间复杂度为 O(n^2)。
- 最简单的方法是使用两层循环,遍历数组中的每一对元素,检查它们的和是否等于
-
哈希表优化:
- 使用哈希表(
HashMap)来存储数组中的元素及其对应的索引。遍历数组时,检查target - nums[i]是否在哈希表中。如果在,则找到了答案;如果不在,则将当前元素及其索引存入哈希表。时间复杂度为 O(n)。
- 使用哈希表(
图解
nums = [2, 7, 11, 15], target = 9
1. 初始化哈希表 map = {}
2. 遍历数组 nums:
- 对于 nums[0] = 2:
- 计算 complement = target - nums[0] = 9 - 2 = 7
- 检查 7 是否在 map 中:
- 不在,将 (2, 0) 存入 map
- 对于 nums[1] = 7:
- 计算 complement = target - nums[1] = 9 - 7 = 2
- 检查 2 是否在 map 中:
- 在,返回 [map.get(2), 1] = [0, 1]
代码详解
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] twoSum(int[] nums, int target) {
// 创建一个哈希表来存储数组中的元素及其索引
Map<Integer, Integer> map = new HashMap<>();
// 遍历数组
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
// 检查 complement 是否在哈希表中
if (map.containsKey(complement)) {
// 如果在,返回对应的索引
return new int[] { map.get(complement), i };
}
// 如果不在,将当前元素及其索引存入哈希表
map.put(nums[i], i);
}
// 如果没有找到答案,返回空数组(题目保证有解)
return new int[] {};
}
}
知识总结
新知识点
-
哈希表的应用:
- 哈希表(
HashMap)是一种非常高效的数据结构,可以在平均 O(1) 时间内进行插入和查找操作。在本题中,哈希表被用来存储数组中的元素及其索引,从而避免了嵌套循环,将时间复杂度从 O(n^2) 降低到 O(n)。
- 哈希表(
-
双指针技巧:
- 虽然本题没有使用双指针技巧,但在其他类似问题中,双指针技巧可以用来优化时间复杂度。例如,在有序数组中查找两数之和时,可以使用双指针技巧将时间复杂度降低到 O(n)。
学习建议
-
理解数据结构:
- 哈希表是解决很多算法问题的关键数据结构。建议深入理解哈希表的工作原理和应用场景。
-
多练习:
- 通过刷题来巩固对哈希表的理解和应用。豆包MarsCode AI 刷题题库中有大量类似的题目,建议多加练习。
学习计划
高效学习方法
-
制定刷题计划:
- 每天刷一定数量的题目,逐步增加难度。建议从简单题目开始,逐步过渡到中等和困难题目。
-
利用错题进行针对性学习:
- 记录错题,分析错误原因,并针对性地进行复习和练习。豆包MarsCode AI 提供了错题记录功能,可以方便地进行错题复习。
-
总结归纳:
- 每刷完一组题目后,总结归纳解题思路和常用技巧。可以将总结的内容记录下来,方便日后复习。
工具运用
结合其他学习资源
-
在线课程:
- 结合在线课程(如 Coursera、LeetCode 等)学习算法和数据结构的基础知识。
-
书籍:
- 阅读经典的算法书籍(如《算法导论》、《算法(第四版)》等),深入理解算法的原理和实现。
-
社区讨论:
- 参与算法和编程社区(如 Stack Overflow、GitHub 等)的讨论,学习他人的解题思路和经验。
学习建议
-
多实践:
- 理论知识固然重要,但实践才是检验真理的唯一标准。多刷题,多动手实践,才能真正掌握算法和数据结构。
-
保持耐心:
- 学习算法和数据结构是一个长期的过程,不要急于求成。保持耐心,逐步提高自己的水平。
-
寻求帮助:
- 遇到难题时,不要害怕寻求帮助。可以向老师、同学或在线社区请教,共同进步。
通过以上方法,结合豆包MarsCode AI 刷题功能,相信你能够高效地提升自己的算法和编程能力。加油!