给定两个数组,编写一个函数来计算它们的交集。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
使用Dictionary字典操作,先把第一个数组遍历进字典,然后再同第二个数组做判定即可!
代码:
public class Solution {
public int[] Intersect(int[] nums1, int[] nums2) {
var dic = new Dictionary<int,int>();
List<int> list = new List<int>();
foreach(int n in nums1)
{
if(dic.ContainsKey(n))
dic[n]++;
else
dic.Add(n,1);
}
foreach(int n in nums2)
{
if(dic.ContainsKey(n)&&dic[n]>0)
{
dic[n]--;
list.Add(n);
}
}
return list.ToArray();
}
}
执行结果
通过
执行用时:128 ms,在所有 C# 提交中击败了99.61%用户
内存消耗:40.4 MB,在所有 C# 提交中击败了5.26%的用户
思路解析
代码:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
return intersect(nums2, nums1);
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int num : nums1) {
int count = map.getOrDefault(num, 0) + 1;
map.put(num, count);
}
int[] intersection = new int[nums1.length];
int index = 0;
for (int num : nums2) {
int count = map.getOrDefault(num, 0);
if (count > 0) {
intersection[index++] = num;
count--;
if (count > 0) {
map.put(num, count);
} else {
map.remove(num);
}
}
}
return Arrays.copyOfRange(intersection, 0, index);
}
}
执行结果
通过
执行用时:3 ms,在所有 Java 提交中击败了45.01%的用户
内存消耗:38.8 MB,在所有 Java 提交中击败了5.86%的用户
复杂度分析
时间复杂度:O( m+n )
空间复杂度:O( m+n )
pre
表示上一次加入答案数组的元素。
pre
,将该数字添加到答案并更新 pre
变量,同时将两个指针都右移一位。
代码
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] intersection = new int[Math.min(length1, length2)];
int index1 = 0, index2 = 0, index = 0;
while (index1 < length1 && index2 < length2) {
if (nums1[index1] < nums2[index2]) {
index1++;
} else if (nums1[index1] > nums2[index2]) {
index2++;
} else {
intersection[index] = nums1[index1];
index1++;
index2++;
index++;
}
}
return Arrays.copyOfRange(intersection, 0, index);
}
}
执行结果
通过
执行用时:2 ms,在所有 Java 提交中击败了77.89%的用户
内存消耗:38.8 MB,在所有 Java 提交中击败了16.56%的用户
复杂度分析
时间复杂度:O( mlogm + nlogn )
空间复杂度:O( logm + logn )
C#
和 Java
两种编程语言进行解题