开启掘金成长之旅!这是我参与「掘金日新计划 · 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]);
}
}
}