开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}
}
通过了,当内存消耗量好大,或许有双重循环(暴力解法)就没有这么大了?