349两个数组的交集&1两数之和

165 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

349一开始错误的解答

    public int[] intersection(int[] nums1, int[] nums2) {
        int[] re = new int[1001];
        int[] resu = new int[1001];    //数组后面的那么多0怎么处理,如果new的时候创建了1001个位置
        //结果须得是去重的,同时不需要考虑输出结果的影响
        for(int i = 0 ;i<nums1.length;i++){
            re[nums1[i]]++;
        }
        int t = 0 ;
        for(int j =0 ;j< nums2.length;j++){
            if(re[nums2[j]] != 0){
                resu[t] = nums2[j];
                t++;
            }
        }
        return resu;
    }
    //这是一开始的版本,没考虑数组内存占用较大,并且也没有进行去重
}

紧接着看了优秀题解,利用了两个哈希表进行去重和内存的减小,虽然最后内存感觉也没减少多少。后面正确的解答:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1==null || nums2 == null){
            return new int[0];
        }
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();

        for(int i = 0;i<nums1.length;i++){
            set1.add(nums1[i]);
        }
        for(int i = 0;i<nums2.length;i++){
            if(set1.contains(nums2[i])){
                set2.add(nums2[i]);
            }
        }
        //要将结果几何转换为数组
        return set2.stream().mapToInt(x -> x).toArray();
}
}

什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

在这里介绍一下哈希表,记录一下想法。哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的数组叫做哈希表(散列表)。

1两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums==null || nums.length==0) {
            return res;
        }
        Map<Integer,Integer> temp = new HashMap<>();
        for(int i = 0;i<nums.length;i++){
            int n = target - nums[i];
            if(temp.containsKey(n)){    //要去判断是否包含这个key值
                res[1] = i;
                res[0] = temp.get(n); 
            }
            temp.put(nums[i],i);   //一开始这个顺序弄反了,要明白key和value的关系,value相当于下标,key相当于数组的值
        }
        return res;
    }
}

通过了,当内存消耗量好大,或许有双重循环(暴力解法)就没有这么大了?