LeetCode每日打卡

给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 与这三个数组都不同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。
 

示例 1:

输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:至少在两个数组中出现的所有值为:
- 3 ,在全部三个数组中都出现过。
- 2 ,在数组 nums1 和 nums2 中出现过。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-out-of-three
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

         很简单的一道题,最简单的思路,(我写的)最长的耗时,最大的内存

经典三循环嵌套,方法很简单,但时间复杂度也是真高。。

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值