给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 与这三个数组都不同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。
示例 1:
输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:至少在两个数组中出现的所有值为:
- 3 ,在全部三个数组中都出现过。
- 2 ,在数组 nums1 和 nums2 中出现过。
很简单的一道题,最简单的思路,(我写的)最长的耗时,最大的内存
经典三循环嵌套,方法很简单,但时间复杂度也是真高。。
int* twoOutOfThree(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* returnSize){
int x=0;
int repe[1000];
memset(repe, 0, 1001);
int *ans = (int*)malloc(sizeof(int) * 1000);
for(int i=0;i<nums1Size;i++){
for(int j=0;j<nums2Size;j++){
for(int k=0;k<nums3Size;k++){
if(nums1[i]==nums2[j]&&repe[nums1[i]]!=1){
ans[x]=nums1[i];
x++;
repe[nums1[i]]=1;
}
if(nums1[i]==nums3[k] && repe[nums1[i]]!=1){
ans[x]=nums1[i];
x++;
repe[nums1[i]]=1;
}
if(nums2[j]==nums3[k]&&repe[nums2[j]]!=1){
ans[x]=nums2[j];
x++;
repe[nums2[j]]=1;
}
}
}
}
*returnSize=x;
return ans;
}
再写一下改进方案,将原三个数组变成一个三维数组,其他思路不变
int* twoOutOfThree(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* returnSize){
int cnt[3][101];
int idx = 0;
int *res = (int*)malloc(sizeof(int) * 101);
memset(cnt, 0, sizeof(cnt));
/* 记录数组出现的元素 */
for (int i = 0; i < nums1Size; i++) {
cnt[0][nums1[i]] = 1;
}
for (int i = 0; i < nums2Size; i++) {
cnt[1][nums2[i]] = 1;
}
for (int i = 0; i < nums3Size; i++) {
cnt[2][nums3[i]] = 1;
}
/* 同时在两个数组中存在, 输出到结果中 */
for (int i = 0; i < 101; i++) {
if (cnt[0][i] + cnt[1][i] + cnt[2][i] >= 2) {
res[idx++] = i;
}
}
*returnSize = idx;
return res;
}
效率提升的不是一星半点。。
下面这个更是重量级。。
s = collections.Counter(list(set(nums1)) + list(set(nums2)) + list(set(nums3)))
return [i for i in s.keys() if s[i] > 1]
作者:peng-peng-rnw
链接:https://leetcode-cn.com/problems/two-out-of-three/solution/python-2xing-gao-ding-by-peng-peng-rnw-7fz0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
python大法好啊。。(真心)