首页 > 其他分享 >LeetCode 2956. 找到两个数组中的公共元素

LeetCode 2956. 找到两个数组中的公共元素

时间:2025-01-15 10:29:24浏览次数:3  
标签:std 元素 nums1 数组 公共 2956 LeetCode nums2

在本篇文章中,我们将探讨如何求解 LeetCode 上的 2956. 找到两个数组中的公共元素问题。这个问题要求我们找到两个数组中公共元素的出现次数,并分别计算这些公共元素在各自数组中的出现次

问题描述 

算法分析

为了解决这个问题,我们可以采用以下步骤:

  1. 排序:首先对两个数组进行排序。排序后,相同的元素会相邻,这有助于我们快速找到公共元素。

  2. 统计出现次数:使用两个数组(或哈希表)来统计 nums1nums2 中每个元素的出现次数。

  3. 计算公共元素的出现次数:遍历两个数组,找到公共元素,并计算这些公共元素在各自数组中的出现次数。

代码实现

以下是使用 C++ 实现的代码:

#include <vector>
#include <algorithm>
#include <unordered_map>

class Solution {
public:
    std::vector<int> findIntersectionValues(std::vector<int>& nums1, std::vector<int>& nums2) {
        // 对两个数组进行排序
        std::sort(nums1.begin(), nums1.end());
        std::sort(nums2.begin(), nums2.end());

        // 使用哈希表统计nums1和nums2中元素的出现次数
        std::unordered_map<int, int> countNums1;
        std::unordered_map<int, int> countNums2;

        for (int num : nums1) {
            countNums1[num]++;
        }
        for (int num : nums2) {
            countNums2[num]++;
        }

        int ans1 = 0, ans2 = 0;
        // 遍历nums1,找到公共元素,并计算在nums2中的出现次数
        for (const auto& pair : countNums1) {
            if (countNums2.find(pair.first) != countNums2.end()) {
                ans1 += pair.second;
            }
        }
        // 遍历nums2,找到公共元素,并计算在nums1中的出现次数
        for (const auto& pair : countNums2) {
            if (countNums1.find(pair.first) != countNums1.end()) {
                ans2 += pair.second;
            }
        }

        return {ans1, ans2};
    }
};

复杂度分析

  • 时间复杂度:O(n log n + m log m),其中 n 和 m 分别是 nums1nums2 的长度。主要时间消耗在排序上。

  • 空间复杂度:O(n + m),用于存储两个数组中元素的出现次数。

结论

通过排序和统计出现次数的方法,我们可以有效地找到两个数组中的公共元素,并计算这些公共元素在各自数组中的出现次数。这种方法简单且高效,适用于处理大规模数据。

 

标签:std,元素,nums1,数组,公共,2956,LeetCode,nums2
From: https://blog.csdn.net/makeke123456/article/details/145155005

相关文章

  • 2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其
    2025-01-15:执行操作可获得的最大总奖励Ⅰ。用go语言,给定一个整数数组rewardValues,其中包含n个代表奖励值的数字。你开始时的总奖励x为0,并且所有下标都是未标记状态。你可以进行以下操作若干次:1.从索引范围[0,n-1]中选择一个未标记的下标i。2.如果rewardValues[i]......
  • 【Leetcode 每日一题】3066. 超过阈值的最少操作数 II
    问题背景给你一个下标从000开始的整数数组num......
  • 【Leetcode 热题 100】295. 数据流的中位数
    问题背景中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如arr=......
  • 【LeetCode】回文链表
    【LeetCode】回文链表......
  • 举例说明数组和对象的迭代方法分别有哪些?
    在前端开发中,数组和对象的迭代是常见的操作。对于数组,有多种迭代方法可供选择,而对于对象,由于其结构的特殊性,迭代方式相对有限但同样重要。以下分别举例说明数组和对象的迭代方法:数组的迭代方法forEach():该方法对数组的每个元素执行一次提供的函数。它不接受任何返回值,并且总是......
  • 排序数组中查找数组的第一个和最后一个位置
    leetcode34之前的博客里面有写到关于二分查找的实现方法,这次这个题目也需要使用到二分查找,关于二分查找的实现可以参考博客:二分查找思路由于题目中给出的数组是递增排序的,那么我们会优先考虑到使用二分查找法,数组中可能出现多个重复的target,我们要查找的就是第一个和最......
  • LeetCode:23.合并K个排序链表
    LeetCode:23.合并K个排序链表解题思路新链表的下一个节点一定是k个链表头中的最小节点。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把链表头插入堆中。弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中。等堆元素全部弹出,合并工作就完成了。classMinHeap{......
  • LeetCode:347.前K个高频元素
    LeetCode:347.前K个高频元素vartopKFrequent=function(nums,k){letmap=newMap();letarr=[...newSet(nums)]nums.forEach(item=>{if(map.has(item)){map.set(item,map.get(item)+1)}else{map.set(item,1)......
  • LeetCode:40.组合总和II
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:40.组合总和II给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每......
  • 【Javascript Day6】for循环练习及数组
    目录for循环练习数组1.构造数组2.字面量数组创建3.数组的遍历循环4.length的使用规则for循环练习按输入弹窗行数画菱形(奇偶皆可)varpro=prompt("请输入行数")varsum="";for(vari=1;i<=pro;i++){if(i<=parseInt((pro*1+1)/2)......