【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针

简介: 【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针

合并相似的物品【LC2363】

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

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

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

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

还有一门考试

TreeMap
  • 思路:使用TreeMap存储item,键值为价值,value值为重量,按价值升序排序。最后将元素放入list中
  • 实现
class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        TreeMap<Integer,Integer> map = new TreeMap<>();
        for (int[] item : items1){
            map.put(item[0], map.getOrDefault(item[0], 0) + item[1]);
        }
        for (int[] item : items2){
            map.put(item[0], map.getOrDefault(item[0], 0) + item[1]);
        }
        List<List<Integer>> res = new ArrayList<>();
        for (var node : map.entrySet()){
            List<Integer> path = new ArrayList<>();
            path.add(node.getKey());
            path.add(node.getValue());
            res.add(path);
        }
        return res;
    }
}

复杂度

时间复杂度:O ( n l o g n + m l o g m )

空间复杂度:O ( n + m )

排序+双指针
  • 思路:将数组按照升序排序后,使用双指针按顺序放入结果集中
  • 实现
class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        Arrays.sort(items1, (o1, o2) -> o1[0] - o2[0]);
        Arrays.sort(items2, (o1, o2) -> o1[0] - o2[0]);
        List<List<Integer>> res = new ArrayList<>();
        int i = 0, j = 0;
        int m = items1.length, n = items2.length;
        while (i < m || j < n){
            if (j == n || ( i < m && items1[i][0] < items2[j][0])){
                List<Integer> path = new ArrayList<>();
                path.add(items1[i][0]);
                path.add(items1[i][1]);
                res.add(path);
                i++;
            }else if (i == m || (j < n && items1[i][0] > items2[j][0])){
                List<Integer> path = new ArrayList<>();
                path.add(items2[j][0]);
                path.add(items2[j][1]);
                res.add(path);
                j++;
            }else{
                List<Integer> path = new ArrayList<>();
                path.add(items1[i][0]);
                path.add(items2[j][1] + items1[i][1]);
                res.add(path);
                j++;
                i++;
            }
        }
        return res;
    }
}

复杂度

  • 时间复杂度:O ( n l o g n + m l o g m )
  • 空间复杂度:O ( 1 )
目录
相关文章
|
6月前
|
算法 C语言
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
|
6月前
DAY-2 | 哈希表、指针与区间划分:字符种数统计问题
```markdown ## 题干 [牛客网链接](https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50) ## 题解 1. **查表法(哈希表)**:利用数组标记出现过的 ASCII 值小于127的字符,首次出现计数,重复则忽略。 2. **指针与区间划分(回头法)**:遍历字符串,对每个字符检查其前所有字符是否重复,重复则不计数。 ## 方法总结 - 哈希表在去重问题中非常实用,可多做相关练习。 - 使用`continue`时注意避免死循环,确保循环变量会改变。 - 多回顾此类问题以巩固理解。 ```
44 2
|
6月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
55 0
|
6月前
|
算法 索引
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)
|
6月前
【每日一题Day303】统计点对的数目 | 哈希表+双指针
【每日一题Day303】统计点对的数目 | 哈希表+双指针
40 0
|
6月前
|
索引
【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表
【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表
39 0
|
6月前
|
存储 索引
【每日一题Day280】LC141环形链表 | 快慢指针 哈希表
【每日一题Day280】LC141环形链表 | 快慢指针 哈希表
33 0
|
索引
力扣142 - 环形链表||【二重双指针+哈希表】
灵活运用双指针,带您一探环形链表的奥秘
100 0
力扣142 - 环形链表||【二重双指针+哈希表】
|
C++ 容器
力扣349 - 两个数组的交集【哈希表+数组+双指针】
对应力扣349.两个数组的交集,三种思路三个方向,带你玩转LeetCode
132 0
力扣349 - 两个数组的交集【哈希表+数组+双指针】
|
机器学习/深度学习 存储
【每日一题Day85】LC1807 替换字符串中的括号内容 | 哈希表 双指针
如果当前字符不是左括号,那么将其直接放入结果末尾;如果是左括号,那么搜索括号内的单词,然后进行替换。
90 0