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;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值