leetcode
leetcode 2051 ~ 2100
合并相似的物品

合并相似的物品

难度:

标签:

题目描述

代码结果

运行时间: 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的过程中,如果两个数组中存在相同的价值但不同的重量,如何确保所有重量都被准确计算并累加?
在此题解中,通过使用哈希表(字典)的数据结构,可以有效处理相同价值的物品重量累加的问题。对于每个物品(价值,重量),如果价值已经在哈希表中存在,就将新的重量加到已有的重量上。这确保了即使物品价值相同但重量不同,它们的重量也会被准确地累加在一起。
🦆
给定哈希表用于存储价值和重量的对应关系,如果遇到哈希冲突应该如何处理?
在Python的字典(哈希表)中,哈希冲突是内部自动处理的。当两个不同的键具有相同的哈希值时,字典会使用链表或其他机制来解决冲突,确保每个键都能正确地映射到其对应的值。因此,在本题解中,使用的哈希表自动处理任何潜在的哈希冲突,不需要额外的处理逻辑。
🦆
在将哈希表转换为列表并进行排序时,是否有可能因为哈希表的无序性导致最终结果的顺序错误?
尽管哈希表(字典)本身是无序的,但在将哈希表的内容转换为列表后,通过使用排序函数(如Python中的sorted()函数),可以按照任何需要的顺序(例如按价值升序)对列表进行排序。这保证了最终输出的列表是有序的,符合题目要求。
🦆
在代码中,对于不存在于哈希表中的价值,直接赋予新的重量,这种处理方式是否会影响到最终结果中物品的总数?
在这种处理方式中,每个新的价格值在首次出现时被添加到哈希表中,而不是被忽略或替换。这确保了所有出现的物品都被计数,因此不会影响最终结果中物品的总数。每个物品的价值都会在最终的列表中准确地表示出来,保证了数据的完整性和准确性。

相关问题