和为s的两个数字
题目
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
Related Topics
数组
双指针
二分查找
👍 261
👎 0
class Solution {
public int[] twoSum(int[] nums, int target) {
}
}
思路
- HashMap存储已遍历的
- 判断HashMap是否包含当前值-target的值
实现
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
int[] res = new int[2];
for (int i=0;i<nums.length;i++){
int n = nums[i];
if (map.containsKey(target-n)){
res[0]=target-n;
res[1]=n;
}
else {
map.put(n,i);
}
}
return res;
}
}
结果
解答成功:
执行耗时:63 ms,击败了5.80% 的Java用户
内存消耗:59.8 MB,击败了86.59% 的Java用户
双指针
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res= new int[2];
int i1=0;
int i2=nums.length-1;
while (i1<i2){
int s = nums[i1]+nums[i2];
if (s<target){
i1++;
}
else if (s>target){
i2--;
}
else {
res[0]=nums[i1];
res[1] =nums[i2];
break;
}
}
return res;
}
}
结果
解答成功:
执行耗时:1 ms,击败了99.52% 的Java用户
内存消耗:61.1 MB,击败了46.01% 的Java用户