LeetCode·每日一题·2023.至少在两个数组中出现的值·模拟

作者:小迅
链接:https://leetcode.cn/problems/two-out-of-three/solutions/2036973/ha-xi-mo-ni-zhu-shi-chao-ji-xiang-xi-by-lynvk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

题目

 

思路

题意 -> 给定三个数组,将三个数组中出现次数大于等于 2 的元素重新组合并返回,顺序任意,其中出现次数计算为 某一个数组出现算 1 次出现次数,重复不累加。

所以在计算出现次数之前,需要对元素进行去重,对于去重我们可以使用哈希表,但是对于本题,由于数据量小,可以直接使用排序加判断进行简单去重,先对所有数组进行排序,然后判断是否重复出现,记录所有元素的出现次数,记录出现次数,可以使用数组哈希表,简单方便,最后枚举数组哈希表,将出现次数大于等于 2 的元素重组并返回

代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *a, const void * b) 
{
    return *(int *) a - *(int *)b; 
}

int* twoOutOfThree(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* returnSize){
    int *ans = (int *)malloc(sizeof(int) * 101);
    memset(ans, 0, sizeof(int) * 101);
    qsort(nums1, nums1Size, sizeof(int), cmp);
    qsort(nums2, nums2Size, sizeof(int), cmp);
    qsort(nums3, nums3Size, sizeof(int), cmp);//排序并初始化
    ++ans[nums1[0]];
    for (int i = 1; i < nums1Size; ++i) {//枚举数组1
        if (nums1[i] == nums1[i-1]) {//判断去重
            continue;
        }
        ++ans[nums1[i]];
    }
    ++ans[nums2[0]];
    for (int i = 1; i < nums2Size; ++i) {//枚举数组2
        if (nums2[i] == nums2[i-1]) {
            continue;
        }
        ++ans[nums2[i]];
    }
    ++ans[nums3[0]];
    for (int i = 1; i < nums3Size; ++i) {//枚举数组3
        if (nums3[i] == nums3[i-1]) {
            continue;
        }
        ++ans[nums3[i]];
    }
    *returnSize = 0;
    for(int i = 0; i < 101; ++i) {//记录大于等于2 的元素
        if (ans[i] >= 2) {
            ans[(*returnSize)++] = i;
        }
    }
    return ans;
}

作者:小迅
链接:https://leetcode.cn/problems/two-out-of-three/solutions/2036973/ha-xi-mo-ni-zhu-shi-chao-ji-xiang-xi-by-lynvk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值