/*程序问题注释开始 程序的版权和版本声明部分 Copyright © 2024,DNUI-stu All rights reserved. 文件名称: Leetcode练习题 作 者: 山北为谷 完成日期: 2024 年 08月 18日 版 本 号: 001 对任务及求解方法的描述部分 问题描述:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
- 解答:
-
import java.util.HashMap; public class J0501 { public static int[] twoSum(int[] nums, int target) { HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { return new int[]{ map.get(nums[i]), i }; } map.put(target - nums[i], i); } return null; }
测试:
public static void main(String[] args) { twoSum(new int[]{2, 7, 11, 15}, 9); int[] result = twoSum(new int[]{2, 7, 11, 15}, 9); if (result != null) { System.out.println("Indices: " + result[0] + ", " + result[1]); } else { System.out.println("No two sum solution"); } }
结果:
Indices: 0, 1
小结:
问题分析
哈希表法
哈希表法是通过建立一个哈希表来存储每个数与其索引的映射关系。遍历数组,对于每个数,先计算出它与目标值的差,然后在哈希表中查找这个差值对应的索引,如果找到了,就意味着找到了一对和为目标值的数,直接返回这两个数的索引即可。这种方法的时间复杂度为O(n),空间复杂度也为O(n)。136
双指针法
双指针法是通过维护两个指针,一个指向数组的起始位置,另一个指向结束位置。在每次迭代中,比较这两个指针所指向的数值之和,如果和等于目标值,则返回这两个下标;如果和大于目标值,则移动右指针;如果和小于目标值,则移动左指针。这种方法适用于数组已排序的情况,时间复杂度为O(n),但并不保证不使用相同元素。29
暴力解法
暴力解法是通过两层嵌套循环穷举所有可能的数对,检查每一对数的和是否等于目标值。这种方法的时间复杂度较高,为O(n^2),但在某些情况下可能会显得过于繁琐或效率低下。3
性能比较
在实际应用中,哈希表法因其较低的时间复杂度和合理的内存消耗而成为首选解决方案。双指针法则依赖于数组已排序的前提,并且在无法保证不使用相同元素的情况下可能需要额外的处理。暴力解法则由于其较高的时间复杂度,通常不被推荐使用。
结论
综上所述,针对twoSum
问题,哈希表法是最优解法,它以较小的空间和时间成本提供了高效的解决方案。双指针法在特定条件下也有较好的表现,但需要对结果进行检查以确保不重复使用元素。暴力解法则因其低效性不宜采用。在编程实践中,应根据具体情况选择最适合的解法。
--题目来自Leetcode,当时第一次看到这个算法是显示0ms 很值得学习