合并相似的物品
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.8 MB
/*
* 思路:
* 1. 使用 Java Stream 和 Collectors.toMap 将 items1 和 items2 中的 value 和 weight 汇总到一个 Map 中。
* 2. 将 Map 转换为一个 Stream,按 key (value) 升序排序,并收集到 List 中。
* 3. 将 List 转换为二维数组并返回。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int[][] mergeItems(int[][] items1, int[][] items2) {
Map<Integer, Integer> map = Stream.concat(Arrays.stream(items1), Arrays.stream(items2))
.collect(Collectors.toMap(
item -> item[0],
item -> item[1],
Integer::sum
));
// 按 key 升序排序,并转换为二维数组
return map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.map(entry -> new int[]{entry.getKey(), entry.getValue()})
.toArray(int[][]::new);
}
}
解释
方法:
这个题解的思路是使用哈希表来记录每个物品的价值和累积的重量。首先遍历第一个物品集items1,将每个物品的价值作为键,其重量作为值加入到哈希表中。如果该价值已存在于哈希表中,则将新的重量加到已有的重量上。接着对第二个物品集items2重复相同的操作。最后,将哈希表中的键值对转换成题目要求的格式,并按价值升序排序输出。
时间复杂度:
O(n1 + n2 + k log k)
空间复杂度:
O(k)
代码细节讲解
🦆
在合并items1和items2的过程中,如果两个数组中存在相同的价值但不同的重量,如何确保所有重量都被准确计算并累加?
▷🦆
给定哈希表用于存储价值和重量的对应关系,如果遇到哈希冲突应该如何处理?
▷🦆
在将哈希表转换为列表并进行排序时,是否有可能因为哈希表的无序性导致最终结果的顺序错误?
▷🦆
在代码中,对于不存在于哈希表中的价值,直接赋予新的重量,这种处理方式是否会影响到最终结果中物品的总数?
▷