Intersection of Two Arrays I & II

本文介绍两种求解两数组交集的算法方案:排序指针法与哈希表法,并针对不同情况讨论了最优选择。

题目链接:https://leetcode.com/problems/intersection-of-two-arrays/

题目大意:要求两个数组的交集(注意集合是不能含有重复的元素的)

 

方法1)

先对两个数组进行排序,设置两个指针pA和pB,分别指向这两个数组,比较nums1[pA]和nums[pB]

a. 如果想等,则为交集中的元素,++pA, ++pB

b. 如果nums[pA] < nums[pB],则++pA

c. 否则,++pB

注意数组中有重复的元素(实现代码中的小trick)

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        int n1 = nums1.size();
        int n2 = nums2.size();
        int i = 0;
        int j = 0;
        vector<int> ans;
        while(i < n1 && j < n2)
        {
            while(i != 0 && nums1[i] == nums1[i-1] && i < n1)
            {
                ++i;
            }

            while(j != 0 && nums2[j] == nums2[j-1] && j < n2)
            {
                ++j;
            }

            if(i < n1 && j < n2)
            {
                if(nums1[i] == nums2[j])
                {
                    ans.push_back(nums1[i]);
                    ++i;
                    ++j;
                }
                else if(nums1[i] < nums2[j])
                {
                    ++i;
                }
                else
                {
                    ++j;
                }
            }
        }

        return ans;
    }
};

 上述算法的时间复杂度为:

每一步的时间复杂度为O(n1log1), O(n2log2), (n1,n2)的最小值,最终的时间复杂度为O(n1log1)和O(n2log2)的最小值

方法2)

使用hash的方法来完成,因为题目当中没有要求交集中的数组是有序的

思路就不说了,直接看下面的代码吧

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
    {
        int n1 = nums1.size();
        int n2 = nums2.size();
        unordered_set<int> sets;
        for(int i=0; i<n1; ++i)
        {
            if(sets.find(nums1[i]) == sets.end())
            {
                sets.insert(nums1[i]);
            }
        }

        unordered_set<int> ans_sets;
        for(int i=0; i<n2; ++i)
        {
            if(sets.find(nums2[i]) != sets.end())
            {
                ans_sets.insert(nums2[i]);
            }
        }

        vector<int> ans(ans_sets.begin(), ans_sets.end());
        return ans;
    }
};

 题目II在I的基础上加上了条件:就是可以出现重复的元素,其实是更加简单了,只要去掉去重的语句即可

题目最后给出了3个问题:

  • What if the given array is already sorted? How would you optimize your algorithm?
  • What if nums1's size is small compared to nums2's size? Which algorithm is better?
  • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

1)如果数组已经有序,上述算法中算法1)的时间复杂度就是min(n1, n2)

2) 如果n1 < n2, 上述算法1更好,因为算法2)要遍历所有的元素

3)可以把num1中的数组放到map中,map记录当前元素以及出现的次数,然后读文件,遍历num2中的元素,如果出现在map中就输出一次,同时次数减1

转载于:https://www.cnblogs.com/shirley-ict/p/5597119.html

### 哈夫曼编码实现 哈夫曼编码是一种基于字符频率的压缩技术,通过构建一棵二叉树来生成最优前缀码。以下是针对字符串 `&#39;The following code computes the intersection of two arrays&#39;` 的 Python 实现过程。 #### 字符频率统计 首先需要统计输入字符串中每个字符的出现次数。这可以通过遍历字符串并记录每种字符的数量完成[^2]。 ```python from collections import Counter def calculate_frequencies(text): frequencies = Counter(text) return dict(frequencies) text = &#39;The following code computes the intersection of two arrays&#39; frequencies = calculate_frequencies(text) print(&quot;Character Frequencies:&quot;, frequencies) ``` #### 构建哈夫曼树 利用字符及其对应的频率数据,可以按照以下方式构建哈夫曼树: 1. 创建一个优先队列(最小堆),其中每个节点表示一种字符以及其频率。 2. 不断取出两个具有最低频率的节点,创建一个新的内部节点作为它们的父亲,并将其频率设置为两子节点频率之。 3. 将新节点重新加入优先队列,直到只剩下一个根节点为止。 ```python import heapq class HuffmanNode: def __init__(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None def __lt__(self, other): return self.freq &lt; other.freq def build_huffman_tree(freq_dict): priority_queue = [] for char, freq in freq_dict.items(): node = HuffmanNode(char, freq) heapq.heappush(priority_queue, node) while len(priority_queue) &gt; 1: l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值