[每日一题]2363.合并相似的物品

2363. 合并相似的物品 给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质:

  • items[i] = [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。
  • items 中每件物品的价值都是 唯一的 。

请你返回一个二维数组 ret,其中 ret[i] = [valuei, weighti], weighti 是所有价值为 valuei 物品的 重量之和 。

注意:ret 应该按价值 升序 排序后返回。

输入:items1 = [[1,1],[4,5],[3,8]], items2 = [[3,1],[1,5]] 输出:[[1,6],[3,9],[4,5]] 解释: value = 1 的物品在 items1 中 weight = 1 ,在 items2 中 weight = 5 ,总重量为 1 + 5 = 6 。 value = 3 的物品再 items1 中 weight = 8 ,在 items2 中 weight = 1 ,总重量为 8 + 1 = 9 。 value = 4 的物品在 items1 中 weight = 5 ,总重量为 5 。 所以,我们返回 [[1,6],[3,9],[4,5]] 。

输入:items1 = [[1,1],[3,2],[2,3]], items2 = [[2,1],[3,2],[1,3]] 输出:[[1,4],[2,4],[3,4]] 解释: value = 1 的物品在 items1 中 weight = 1 ,在 items2 中 weight = 3 ,总重量为 1 + 3 = 4 。 value = 2 的物品在 items1 中 weight = 3 ,在 items2 中 weight = 1 ,总重量为 3 + 1 = 4 。 value = 3 的物品在 items1 中 weight = 2 ,在 items2 中 weight = 2 ,总重量为 2 + 2 = 4 。 所以,我们返回 [[1,4],[2,4],[3,4]] 。

提示:

  • 1 <= items1.length, items2.length <= 1000
  • items1[i].length == items2[i].length == 2
  • 1 <= valuei, weighti <= 1000
  • items1 中每个 valuei 都是 唯一的
  • items2 中每个 valuei 都是 唯一的

Solution

class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int[] ints:items1) map.put(ints[0], ints[1]);
        for (int[] ints:items2) {
            if(map.containsKey(ints[0])) {
                map.put(ints[0], map.get(ints[0])+ints[1]);
            }else {
                map.put(ints[0], ints[1]);
            }
        }
        TreeSet<Integer> integers = new TreeSet<Integer>(map.keySet());
        List<List<Integer>> lists = new ArrayList<>();
        for (Integer s:integers) {
            List<Integer> list = new ArrayList<>();
            list.add(s);
            list.add(map.get(s));
            lists.add(list);
        }
        return lists;
    }
}
class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        Arrays.stream(items1).forEach(item -> map.put(item[0], item[1]));
        Arrays.stream(items2).forEach(item -> map.put(item[0], map.getOrDefault(item[0], 0) + item[1]));
        return map.entrySet().stream().map(entry -> Arrays.asList(entry.getKey(), entry.getValue())).collect(Collectors.toList());
    }
}

Ideas

建立一个哈希表,其键值表示物品价值,其值为对应价值物品的重量之和。依次遍历 items1和 items2中的每一项物品,同时更新哈希表。最后,我们取出哈希表中的每一个键值对放入数组,对数组按照 value 值排序即可。有些语言可以在维护键值对的同时,对键值对按照「键」进行排序