刷题的日常-合并相似的物品

140 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情

刷题的日常-2023年2月28号

一天一题,保持脑子清爽

合并相似的物品

来自leetcode的 2363 题,题意如下:

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

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

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

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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出两个二维数组
  • 二维数组中嵌套的只有两个值,一个是物品的价值,一个是物品的重量
  • 要求我们计算相同价值的物品的重量
  • 并按价值排序之后返回

做题思路

简单题,直接暴力解决。要汇总相同价值的物品,那么可以用map进行映射。扫描两个数组,对每个元素,用第一个值作为映射条件。如果没有则进行初始化,有了则将当前重量加回去。因为需要排序,所以这里用来treeMap,可以根据key的大小进行排序。步骤如下;

  • 开辟一个 TreeMap 进行映射
  • 遍历两个数组
  • 对每个元素进行统计
  • 因为是有序的,所以直接获取 Map 中的 values,转化成 list 直接返回即可

代码实现

代码实现如下:

public class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        Map<Integer, List<Integer>> map = new TreeMap<>();
        calc(items1, map);
        calc(items2, map);
        return new ArrayList<>(map.values());
    }
    private void calc(int[][] items1, Map<Integer, List<Integer>> map) {
        for (int[] item : items1) {
            List<Integer> list = map.computeIfAbsent(item[0], o -> {
                List<Integer> res = new ArrayList<>(2);
                res.add(item[0]);
                res.add(0);
                return res;
            });
            list.set(1, list.get(1) + item[1]);
        }
    }
}

image.png