day35 JZ57 和为S的两个数字(Java)

97 阅读2分钟

题目来源: 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 天,点击查看活动详情