题目来源: JZ56 数组中只出现一次的两个数字
题目描述:
- 描述: 输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。 数据范围: 0≤len(array)≤10^5 , 1≤array[i]≤10^6 要求: 空间复杂度O(1),时间复杂度O(n)
示例1:
输入:[1,2,4,7,11,15],15
返回值:[4,11]
说明:返回[4,11]或者[11,4]都是可以的
示例2:
输入:[1,5,11],10
输出:[]
说明:不存在,返回空数组
思路:哈希表
- 知识点:哈希表 思路:
- 题目要求是
和为S的两个数字,那么说明这两个数字都存在于数组中,所以我们可以对数组进行遍历,然后将数组中的元素存于哈希表中,方便快速检查某个数字是否在数组中出现过
- 题目要求是
- 具体做法:
- 1.构建一个哈希表用于辅助操作
- 2.对哈希表而言,数组元素存于哈希表的key值,然后将value设为该元素在数组中的下标
- 3.遍历数组的每一个元素,在哈希表中检测是否存在S减去该元素的结果
- 4.如果存在,那么就得到了结果,如果不存在,将该元素存在哈希表,等待可以匹配的值出现
具体实现:
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;
}
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情”