0
点赞
收藏
分享

微信扫一扫

LeetCode每日打卡

以沫的窝 2022-03-30 阅读 81
c++

给你三个整数数组 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大法好啊。。(真心)

举报

相关推荐

0 条评论