标签:出现 star java 数组的交集 时间复杂度 示例 hash表 += 磁盘
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
****进阶:
代码如下
/*
* 执行用时:4 ms, 在所有 Java 提交中击败了53.75% 的用户
* 内存消耗:38.9 MB, 在所有 Java 提交中击败了51.97% 的用户
* */
public int[] intersect(int[] nums1, int[] nums2) {
if(nums2.length > nums1.length){
return intersect(nums2,nums1);
}
Map<Integer, Integer> map = new HashMap<>();
for(int num : nums1){
map.merge(num, 1, (oldX, newX) -> oldX += 1);
}
int[] res = new int[nums1.length];
int index = 0;
for(int num : nums2){
int count = map.getOrDefault(num, 0);
if(count > 0){
res[index] = num;
index ++;
count --;
}
map.put(num, count);
}
return Arrays.copyOfRange(res, 0, index);
}
ps:对int[]数组的复制操作
System.arraycopy(arr, copied, start, end);
Arrays.copyOfRange(intersection, 0, index);
区别:Arrays.copyOf()不仅仅只是拷贝数组中的元素,在拷贝元素时,会创建一个新的数组对象。而System.arrayCopy只拷贝已经存在数组元素。
? Array.copyOf()底层是调用的System.arrayCopy(new了一个数组对象,复制后返回)
代码如下
/*
*执行用时:1 ms, 在所有 Java 提交中击败了100.00% 的用户
*内存消耗:38.8 MB, 在所有 Java 提交中击败了75.93% 的用户
*/
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int m = nums1.length;
int n = nums2.length;
int[] res = new int[m + n];
int length = 0;
int i = 0, j = 0;
while(i < m && j < n){
if(nums1[i] == nums2[j]){
res[length] = nums1[i];
length++;
i++;
j++;
}else if(nums1[i] < nums2[j]){
i++;
}else{
j++;
}
}
return Arrays.copyOfRange(res, 0, length);
}
ps:这里新建数组可以改成如下。
? int[] res = new int[Math.min(m,n)]
,这样空间复杂度就变成了O(min(m,n))
标签:出现 star java 数组的交集 时间复杂度 示例 hash表 += 磁盘
原文地址:https://www.cnblogs.com/g9420/p/13964212.html