【发布时间】:2020-10-11 07:07:07
【问题描述】:
给定两个数组 A 和 B。任务找出共同不同的数量(两个数组中元素的差异)。 示例:
A=[3,6,8]
B=[1,6,10]
so we get differenceSet for A
differenceSetA=[abs(3-6),abs(6-8),abs(8-3)]=[3,5,2]
similiarly
differenceSetB=[abs(1-6),abs(1-10),abs(6-10)]=[5,9,4]
Number of common elements=Intersection :{differenceSetA,differenceSetB}={5}
Answer= 1
我的方法 O(N^2)
int commonDifference(vector<int> A,vector<int> B){
int n=A.size();
int m=B.size();
unordered_set<int> differenceSetA;
unordered_set<int> differenceSetB;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
differenceSetA.insert(abs(A[i]-A[j]));
}
}
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
differenceSetB.insert(abs(B[i]-B[j]));
}
}
int count=0;
for(auto &it:differenceSetA){
if(differenceSetB.find(it)!=differenceSetB.end()){
count++;
}
}
return count;
}
请提供优化 O(N log N) 方法的建议
【问题讨论】:
-
对于给定的数组,您可以在 O(n logn) 中找到差异集:stackoverflow.com/questions/64220374/…
-
@Damien - 请添加包含此内容的答案,然后添加一些逻辑以从中找到共同值。因此,如果他愿意,OP 可以批准和投票
-
我忘了提到,如果输入值的范围不是太大,这种方法会很有效。算法是(n log n),但是这里n是取值范围,不是输入数组的大小
-
@Damien,我在实施这种方法时遇到了困难。你能帮帮我吗?
-
我会尝试发布答案,并附上一些细节。数据范围是多少?
标签: c++ algorithm data-structures set c++17