C++的set和map的使用 - (leetcode两个数组的交集)

set和map都是一种关联式容器,它们通常都是语言标准库内置的,其有以下操作:

插入

s.insert()

查找

if(s.find(nums2[i]) != s.end())    //找到的情况

删除

s.erase(10)        //删除10号元素

修改 change (map专有)

set有以下特性

  • 所有元素只有key没有value
  • 不允许出现重复值
  • 所有的元素都会被自动排序
  • 不能通过迭代器来改变set的值,因为set的值就是键,但可以访问

leetcode题目

给定两个数组,编写一个函数来计算它们的交集。

示例

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

代码

#include<iostream>
#include<vector>
#include<set>

class Solution {
    
    
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    
    
        set<int> record;
        for(int i=0; i<nums1.size(); i++){
    
    
            record.insert(nums1[i]);
        }
        set<int> result;
        for(int i=0; i<nums2.size(); i++){
    
    
            if(record.find(nums2[i]) != record.end())
                result.insert(nums2[i]);
        }
        vector<int> res;
        //使用迭代器访问set
        for(set<int>::iterator iter = result.begin(); iter != result.end(); iter++)
            res.push_back(*iter);
        return res;
    }
};

map有以下特性

  • 所有元素都是键 + 值存在
  • 键不允许重复,键都会有个对应值
  • map的键是不能修改的,但是其键对应的值是可以修改的

map遍历键值

map<int, int> record;
for(map<int>::iterator iter = record.begin(); iter != record.end(); iter++){
    
    
        //first是键, second是值
        cout<<iter->first<<" "<<iter->second<<endl;
}

leetcode题目

给定两个数组,编写一个函数来计算它们的交集,数组元素可能重复。

示例

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

代码

#include<iostream>
#include<vector>
#include<map>

class Solution {
    
    
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
    
    
        map<int, int> record;
        for(int i=0; i<nums1.size(); i++)
            record[nums1[i]]++;
        
        vector<int> res;
        for(int i=0; i<nums2.size(); i++){
    
    
            if(record[nums2[i]] > 0){
    
    
                res.push_back(nums2[i]);
                record[nums2[i]]--;
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/UCB001/article/details/106840586