力扣刷题日记-2363. 合并相似的物品

63 阅读1分钟

给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] = [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一的 。 请你返回一个二维数组 ret,其中 ret[i] = [valuei, weighti], weighti 是所有价值为 valuei 物品的 重量之和 。 注意:ret 应该按价值 升序 排序后返回。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/me… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路
  • 相同的加在一起,所以没有重复的,所以可以用一个map当容器
/**
 * @param {number[][]} items1
 * @param {number[][]} items2
 * @return {number[][]}
 */
var mergeSimilarItems = function (items1, items2) {
    if (!items1 && !items2) return []
    if (!items1.length && !items2.length) return []
    const comparer = (a, b) => {
        if (a[0] == b[0]) {
            return a[1] - b[1]
        } else {
            return a[0] - b[0]
        }
    }
    items1.sort(comparer)
    items2.sort(comparer)
    let map = new Map()
    let i = 0, j = 0;
    while (i < items1.length || j < items2.length) {
        let name1 =items1[i] && items1[i][0],
            name2 =items2[j] && items2[j][0],
            n1 = items1[i] &&items1[i][1],
            n2 = items2[j] &&items2[j][1];
        if (name1 == name2) {
           map.set(name1, (map.get(name1) || 0) + n1 + n2)
            i++
            j++
        } else {
            if (name1) {
                map.set(name1, (map.get(name1) || 0) + n1)
                i++
            }
            if (name2) {
                map.set(name2, (map.get(name2) || 0) + n2)
                j++
            }
        }

    }
    let ans = [...map.entries()]
    ans.sort(comparer)
    return ans
};