C++ - map 的 例题

 前言

本博客在 一下文章关于 map 和 set 讲解之下,对 map 当中的 operator[] ()函数的功能运用,感受 map 功能强大。

 
 

349. 两个数组的交集 - 力扣(LeetCode)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

法一: 

我们可以,两个集合当中的内容都放进 两个 set 当中,第一个是 去重,第二是排序,好查找。然后,去两个set 一个一个遍历比较,有相同的就是交集。

法二:

还有比 法一 更好的方法,开始也都把两个集合放到 两个 set 当中。然后中序遍历保存结果,比如是下面两个结果:

1 3 5 7 9
3 5 6 7 8

 然后,遍历不再想上述一样暴力查找,而是:

都从第一位置开始,值小的一方开始++,直到遍历到相同元素停止,找到交集:

C++ - map 的 例题_第1张图片

 第一次找到 3  ,停止。然后两个指针同时++,都之下下一个元素位置。

然后重复上述过程就可以找出交集。

当然,还可以用上述方法寻找差集

C++ - map 的 例题_第2张图片

 代码实现:

class Solution {
public:
    vector intersection(vector& nums1, vector& nums2) {
        set s1(nums1.begin(),nums1.end());
        set s2(nums2.begin(),nums2.end());

        vector v;
        auto it1 = s1.begin();
        auto it2 = s2.begin();
        while(it1 != s1.end() && it2 != s2.end())
        {
            if(*it1 < *it2)
            {
                it1++;
            }
            else if(*it2 < *it1)
            {
                it2++;
            }
            else{
                v.push_back(*it1);
                ++it1;
                ++it2;
            }
        }
        return v;
    }
};

 上述这种方法可以用在服务器当中:
 

C++ - map 的 例题_第3张图片

 上述这种模型当中,手机等等终端经常和 服务器 进行数据的比对,比如判断交集以外的数据,当手机当中有 服务器当中没有的 数据的时候,就需要上传到 服务器当中。这些本质是都是一些数据比对。使用上述 用 set 的方式是非常好的方法。

 
20. 有效的括号 - 力扣(LeetCode)

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

C++ - map 的 例题_第4张图片

 在上图当中可以感受一些 ,C++有了 map 之后 相比于 C 语言的是实现有多么好用。

而且,对于 c 当中硬性的括号判断,C++当中map 只需要多增加几个结点就可以了。C中中硬性的括号判断很冗余。

 138. 复制带随机指针的链表 - 力扣(LeetCode)

 C语言当中的实现过程可以看下面这篇博客:
赋值带随机指针的链表-CSDN博客

 以下是C++当中利用 map 的key 和 value 来实现的映射关系。

class Solution {
public:
    Node* copyRandomList(Node* head) {
        map CopyNodeMap;  // key 值存储 原链表当中的结点
                                        // value 值存储 新链表当中结点
                                        // 两边位置相对一样
        Node* copyhead = nullptr, *copytail = nullptr;

        // 先构建新链表,构建 next 指针
        Node* cur = head;
        while(cur)
        {
            Node* copyNode = new Node(cur->val);
            if(copyhead == nullptr)
            {
                copyhead = copytail = copyNode;
            }
            else
            {
                copytail->next = copyNode;
                copytail = copytail->next;
            }

            // 添加新表和旧表映射关系
            CopyNodeMap[cur] = copytail;
            cur = cur->next;
        }

        // 新表当中 random赋值
        cur = head;
        Node* copyptr = copyhead;
        while(cur)
        {
            if(cur->random == nullptr)
                copyptr->random = nullptr;
            else
                copyptr->random = CopyNodeMap[cur->random];

            cur = cur->next;
            copyptr = copyptr->next;
        }

        return copyhead;
    }
};

你可能感兴趣的:(c++,java,算法)