描述
输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围: 0≤len(array)≤105 0≤len(array)≤105 , 1≤array[i]≤106 1≤array[i]≤106
示例1
输入:
[1,2,4,7,11,15],15
返回值:
[4,11]
说明:
返回[4,11]或者[11,4]都是可以的
示例2
输入:
[1,5,11],10
返回值:
[]
说明:
不存在,返回空数组
示例3
输入:
[1,2,3,4],5
返回值:
[1,4]
说明:
返回[1,4],[4,1],[2,3],[3,2]都是可以的
示例4
输入:
[1,2,2,4],4
返回值:
[2,2]
实现代码:
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> a=new ArrayList<Integer>();
for(int i=0;i<array.length;i++){
for(int j=i+1;j<array.length;j++){
if(array[i]+array[j]==sum){
a.add(array[i]);
a.add(array[j]);
return a;
}
}
}
return a;
}
}
时间复杂度:O(N^2)
其他方法:
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList<Integer>();
//创建哈希表,两元组分别表示值、下标
HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
//在哈希表中查找target-numbers[i]
for(int i = 0; i < array.length; i++){
int temp = sum - array[i];
//若是没找到,将此信息计入哈希表
if(!mp.containsKey(temp)){
mp.put(array[i], i);
}
else{
//取出数字添加
res.add(temp);
res.add(array[i]);
break;
}
}
return res;
}
}
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList<Integer>();
//左右双指针
int left = 0, right = array.length - 1;
//对撞双指针
while(left < right){
//相加等于sum,找到目标
if(array[left] + array[right] == sum){
res.add(array[left]);
res.add(array[right]);
break;
//和太大,缩小右边
}else if(array[left] + array[right] > sum)
right--;
//和太小,扩大左边
else
left++;
}
return res;
}
}
题目来源:和为S的两个数字_牛客题霸_牛客网