首页 > 其他分享 >2363. 合并相似的物品

2363. 合并相似的物品

时间:2023-04-08 18:36:28浏览次数:45  
标签:vector ++ 复杂度 合并 items2 items1 ans 物品 2363

题目链接:2363. 合并相似的物品

方法一:归并

解题思路

先对两个整数数组进行\(sort\)排序,然后对两个数组进行归并操作。

代码

class Solution {
public:
    vector<vector<int>> mergeSimilarItems(vector<vector<int>>& items1, vector<vector<int>>& items2) {
        sort(items1.begin(), items1.end());
        sort(items2.begin(), items2.end());
        int i = 0, j = 0, n1 = items1.size(), n2 = items2.size();
        vector<vector<int>> ans;
        while (i < n1 && j < n2) {
            if (items1[i][0] == items2[j][0]) ans.push_back({items1[i][0], items1[i ++ ][1] + items2[j ++ ][1]});
            else if (items1[i][0] < items2[j][0]) ans.push_back(items1[i ++ ]);
            else ans.push_back(items2[j ++ ]);
        }
        while (i < n1) ans.push_back(items1[i ++ ]);
        while (j < n2) ans.push_back(items2[j ++ ]);
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(nlogn)\);
空间复杂度:\(O(1)\)。

方法二:哈兮

解题思路

利用数组\(w\)存储\(value\)的\(weight\)的值,即\(w[value] = weight\),需要消耗额外的存储空间;

代码

class Solution {
public:
    vector<vector<int>> mergeSimilarItems(vector<vector<int>>& items1, vector<vector<int>>& items2) {
        int w[1001] = {0}; // w[i]表示value = i时的weight的值
        for (auto &v : items1) w[v[0]] += v[1];
        for (auto &v : items2) w[v[0]] += v[1];
        vector<vector<int>> ans;
        for (int i = 0; i <= 1000; i ++ ) if (w[i]) ans.push_back({i, w[i]});
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\),\(n = max(n1, n2, m)\),\(n1\) 和 \(n2\)为数组长度,\(m\)为数组\(w\)的长度;
空间复杂度:\(O(m)\)。

标签:vector,++,复杂度,合并,items2,items1,ans,物品,2363
From: https://www.cnblogs.com/lxycoding/p/17298963.html

相关文章

  • poj-3367(线段树+区间合并)
    HotelPOJ-3667思路:与hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)类似,只不过是区间修改,多维护一个最大连续区间sum。#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<fstream>#include<iostream>#include<cstdio>#include<deque>#includ......
  • 在 PostgreSQL 中使用 EXCLUDE 值进行 Upsert(重复更新时插入、合并)
    上次,我们读到了如何在PostgreSQL中使用 UPSERT。在快速回顾中,UPSERT 是 INSERTONDUPLICATEUPDATE 的缩写,如果它们与以前的条目不匹配,则倾向于将 INSERT 值插入表中。如果有,它们会自动更新。PostgreSQL中的 EXCLUDED 是什么EXCLUDED 是DBMS给一个特殊表的名称,......
  • css边距合并的问题
    上下两个盒子边距合并问题<style>*{margin:0px;padding:0px;}div{width:100px;height:100px;}.top{background-color:red;margin-b......
  • 颜色分类(数组、双指针)、排列序列(递归、数学)、合并区间(数组、排序)
    颜色分类(数组、双指针)给定一个包含红色、白色和蓝色,一共n__个元素的数组,**原地(https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数0、1和2分别表示红色、......
  • 617. 合并二叉树
    给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null的节点将直接作为新二叉树......
  • 区间合并 acwing803
    linkcode#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ intn; intans=1,tpr=0; vector<pair<int,int>>v; intl,r; cin>>n; for(inti=1;i<=n;i++){ cin>>l>>r;......
  • hdu-1540(线段树+区间合并)
    TunnelWarfareHDU-1540思路:没被摧毁的村庄为1,否则为0,用len记录线段树维护区间的两个信息:前缀最长1的序列pre后缀最长1的序列suf父节点与左右子节点的关系://lc为左节点,rc为右节点1.若左右结点都不满1,则tr[p].pre=tr[lc].pre,tr[p].suf=tr[rc].suf2.若左节点满1,tr......
  • 合并石子
    #include<iostream>#include<string.h>usingnamespacestd;constintN=310;intn;ints[N];intf[N][N];intmain(){scanf("%d",&n);memset(f,0x3f,sizeoff);for(inti=1;i<=n;i++){intx;......
  • 视频剪辑工具,批量分割视频、合并视频、嵌套合并视频、支持添加字幕、调整色调
    最近有很多朋友在问,怎么剪辑视频,比如合并视频、分割视频、添加封面等等,该如何实现呢?今天小编给大家分享一个新的剪辑技巧,下面一起来试试吧。材料准备:一台Win系统的电脑安装一个好简单批量智剪视频素材若干步骤演示:步骤1:运行【好简单批量智剪】,其中有多个剪辑技巧,比如说分割视频,可以......
  • OS-Linux-Tool-可视化比较与合并工具Meld
    OS-Linux-Tool-可视化比较与合并工具Meld在Linux系统上有时会需要进行文件比较与合并,Meld能提供相关功能。http://meldmerge.org/http://meldmerge.org/help/MeldVisualdiffandmergetoolMeldhelpsyoucomparefiles,directories,andversioncontrolledprojects.......