两数之和
题目:
给定一个整数数组 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
只会存在一个有效答案思路:
| 方法 | 适用条件 | 时间复杂度 | 空间复杂度 | 说明 | 
|---|---|---|---|---|
| 1. 双重循环(暴力) | 任意数组 | O(n²) | O(1) | 枚举所有两两组合,无需额外空间 | 
| 2. 哈希表(推荐) | 任意数组 | O(n) | O(n) | 单次遍历 + 哈希查找 O(1),总时间 O(n) | 
| 3. 对撞指针(双指针) | 排序数组 | O(n) | O(1) | 需先排序(O(n log n)),若原数组无序则总时间 O(n log n) | 
//双循环
class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;for (int i = 0; i < n; i++) {for (int j = 1; j < n; j++) {if (nums[i] + nums[j] == target) {return new int[] { i, j };}}}return null;}
}//哈希表
class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < n; i++) {map.put(nums[i], i);}for (int i = 0; i < n; i++) {if (map.containsKey(target - nums[i]) && i != map.get(target - nums[i])){return new int[] { i, map.get(target - nums[i]) };}}return null;}
}//双指针(必须是有序数组)
class Solution {public int[] twoSum(int[] nums, int target) {int n = nums.length;int l = 0;int r = n - 1;while (l < r) {int sum = nums[l] + nums[r];if (sum == target) {return new int[]{l,r};} else if (sum < target) { //如果总和小于目标值,左指针右移,反之右指针左移l++;} else {r--;}}return null;}
}