剑指–和为s的两个数字
1,题目:
2,思路:
方法一:双指针:
-
1,初始化: 双指针 i , j 分别指向数组 nums 的左右两端 (俗称对撞双指针)。
-
2,循环搜索: 当双指针相遇时跳出;
-
(1)s=nums[i]+nums[j] ;
-
(2)若 s>target ,则指针 j 向左移动,即执行 j=j−1 ;
-
(3)若 s < target ,则指针 i 向右移动,即执行 i = i + 1;
-
(4)若 s = target ,立即返回数组 [nums[i],nums[j]] ;
-
-
3,返回空数组,代表无和为 target 的数字组合。
方法二:HashMap:
- (1) 遍历每个数的同时去判断可以和它相加得到目标值的数是否出现过。
- (2) 通过 HashMap 判断是否出现过符合条件的数。
3,代码:
代码一:双指针:
class Solution {
public int[] twoSum(int[] nums, int target) {
//双指针
/*
1,初始化: 双指针 i , j 分别指向数组 nums 的左右两端 (俗称对撞双指针)。
2,循环搜索: 当双指针相遇时跳出;
(1)s=nums[i]+nums[j] ;
(2)若 s>target ,则指针 j 向左移动,即执行 j=j−1 ;
(3)若 s < target ,则指针 i 向右移动,即执行 i = i + 1;
(4)若 s = target ,立即返回数组 [nums[i],nums[j]] ;
3,返回空数组,代表无和为 target 的数字组合。
*/
int i = 0, j = nums.length - 1;
while(i < j) {
int s = nums[i] + nums[j];
if(s < target) i++;
else if(s > target) j--;
else return new int[] { nums[i], nums[j] };
}
return new int[0];
}
}
方法二:HashMap:
//HashMap:
//(1) 遍历每个数的同时去判断可以和它相加得到目标值的数是否出现过。
//(2) 通过 HashMap 判断是否出现过符合条件的数。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] ans = new int[2];
// 数组不够两个数直接返回。
if (nums == null || nums.length < 2) {
return ans;
}
// 定义 HashMap 辅助搜索是否出现过符合条件的数。
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
// 循环遍历数组中的数,如果 map 中有符合条件的数则组队返回,否则加入 map 。
int curr = target - nums[i];
if (map.containsKey(curr)) {
return new int[]{curr, nums[i]};
}
map.put(nums[i], i);
}
// 遍历完数组,没有符合条件的一对数。
return ans;
}
}