Leetcode1122. 数组的相对排序

【Leetcode-算法】1122.数组的相对排序(C++) 1122.数组的相对排序 给你两个数组,arr1 和arr2, arr2中的元素各不相同 arr2 中的每个元素都出现在arr1中 对 arr1中的元素进行排序,使 arr1 中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19] 提示: arr1.... 阅读详情

Every day a Leetcode

题目来源:1122. 数组的相对排序

解法1:哈希

用集合 set 存储 arr2 中的元素。

遍历数组 arr1 ,设当前元素为 num:

  • 如果 num 在 set 中出现,用哈希表 hash 记录 num 和它出现的次数。
  • 否则,用将 num 插入数组 remain。

遍历数组 arr2,设当前元素为 num。向 ans 中插入 hash[num] 个 num。

将 remain 增序排序,将 remain 插入 ans 的后面。

代码:

/*
 * @lc app=leetcode.cn id=1122 lang=cpp
 *
 * [1122] 数组的相对排序
 */

// @lc code=start
class Solution
{
public:
    vector<int> relativeSortArray(vector<int> &arr1, vector<int> &arr2)
    {
        unordered_map<int, int> hash;
        set<int> set(arr2.begin(), arr2.end());
        vector<int> remain;
        for (const int &num : arr1)
        {
            if (set.count(num))
                hash[num]++;
            else
                remain.push_back(num);
        }
        vector<int> ans;
        for (const int &num : arr2)
        {
            if (hash.count(num))
                for (int i = 0; i < hash[num]; i++)
                    ans.push_back(num);
        }
        // 未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾
        sort(remain.begin(), remain.end());
        for (int i = 0; i < remain.size(); i++)
            ans.push_back(remain[i]);
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(mlogm+n),其中 m 和 n 分别是数组 arr1 和 arr2 的长度。构建哈希表的时间复杂度为 O(n),排序的时间复杂度为 O(mlogm)。

空间复杂度:O(logm+n),其中 m 和 n 分别是数组 arr1 和 arr2 的长度。哈希表的空间复杂度为 O(n),排序使用的栈的空间复杂度为 O(mlogm)。

解法2:计数排序

注意到本题中元素的范围为 [0, 1000],这个范围不是很大,我们也可以考虑不基于比较的排序,例如「计数排序」。

优化:实际上,我们不需要使用长度为 1001 的数组,而是可以找出数组 arr1 中的最大值 upper,使用长度为 upper+1 的数组即可。

代码:

/*
 * @lc app=leetcode.cn id=1122 lang=cpp
 *
 * [1122] 数组的相对排序
 */

// @lc code=start
// class Solution
// {
// public:
//     vector<int> relativeSortArray(vector<int> &arr1, vector<int> &arr2)
//     {
//         unordered_map<int, int> hash;
//         set<int> set(arr2.begin(), arr2.end());
//         vector<int> remain;
//         for (const int &num : arr1)
//         {
//             if (set.count(num))
//                 hash[num]++;
//             else
//                 remain.push_back(num);
//         }
//         vector<int> ans;
//         for (const int &num : arr2)
//         {
//             if (hash.count(num))
//                 for (int i = 0; i < hash[num]; i++)
//                     ans.push_back(num);
//         }
//         // 未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾
//         sort(remain.begin(), remain.end());
//         for (int i = 0; i < remain.size(); i++)
//             ans.push_back(remain[i]);
//         return ans;
//     }
// };

class Solution
{
public:
    vector<int> relativeSortArray(vector<int> &arr1, vector<int> &arr2)
    {
        int upper = *max_element(arr1.begin(), arr1.end());
        vector<int> freq(upper + 1, 0);
        for (const int &num : arr1)
            freq[num]++;
        vector<int> ans;
        for (const int &num : arr2)
        {
            for (int i = 0; i < freq[num]; i++)
                ans.push_back(num);
            freq[num] = 0;
        }
        for (int num = 0; num <= upper; num++)
            for (int i = 0; i < freq[num]; i++)
                ans.push_back(num);
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(m+n+upper),其中 m 和 n 分别是数组 arr1 和 arr2 的长度。upper 是数组 arr1 的最大值。

空间复杂度:O(upper),其中 upper 是数组 arr1 的最大值。即为数组 freq 需要使用的空间。

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查) 本文详细介绍了如何使用SpyGlass CDC工具链中的sgdc约束文件解决跨时钟域(CDC)报错问题。从基础约束文件架构到复杂场景调试,涵盖了时钟域定义、复位信号约束、Waiver策略等关键技巧,并附有常见错误排查方法,帮助工程师高效处理CDC验证挑战。 阅读详情

相关推荐

四旋翼无人机数学模型推导

本周开始进行四旋翼无人机的学习工作,首先来进行四旋翼无人机的数学模型推导工作。。 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前,首先引入坐标变换的概念,定义两个坐标系惯性坐标系{E},以及机体坐标系{B},惯性坐标系就相当于在地面建立的、静止不动的坐标系,也是我们操纵无人机所在的空间,而机体坐标系是建立于四旋翼机体之上,随着四旋翼姿态变换而变化,所以建立一种地面上的惯性坐标系与四旋翼机体坐标系之间的转换关系,就有这个必要。 对于惯性坐标系{E},以及机体坐标系{B},它们之间的转换关系

BiuBiuSun的博客 1万+

力扣题解-1122. 数组的相对排序(计数排序)

题目:1122. 数组的相对排序

lpp 5241

Oracle到金仓数据库信创改造迁移实施规划方案

**性能测试和优化**:对金仓数据库的性能进行测试,根据业务负载情况进行必要的调优,确保系统能够稳定高效运行。- **数据兼容性**:评估Oracle数据库中的数据结构和金仓数据库的兼容性,明确需要重构的数据模型。- **性能测试**:通过对金仓数据库的性能测试,预估在实际业务环境下的表现,是否能达到业务需求。- **工具选择**:选择适合的迁移工具,如金仓数据库提供的迁移工具,能够提升迁移效率和准确性。- **全面迁移**:在初步迁移成功后,进行全面数据迁移,确保所有数据完整迁移到金仓数据库上。

hdrhdrjdididrr的博客 482

#力扣 LeetCode1122. 数组的相对排序 # 在所有 Java 提交中击败了 100.00% 的用户 @FDDLC

题目描述: 1122. 数组的相对排序 - 力扣(LeetCode) (leetcode-cn.com) Java代码: import java.util.Arrays; class Solution { // 1 <= arr1.length, arr2.length <= 1000 // 0 <= arr1[i], arr2[i] <= 1000 // arr2 中的元素 arr2[i] 各不相同 // arr2 中的每个元.

LiuXingchang的博客 445

电拖笔记1电磁学基本知识与定律

电拖学习

qq458629839的博客 1135

CanMV K230实战:用MicroPython玩转AI视觉识别(附完整代码)

本文详细介绍了如何使用MicroPython在CanMV K230开发板上实现AI视觉识别,包括环境搭建、摄像头配置、模型部署及优化技巧。通过实战案例(如智能门禁和工业分拣机器人),展示如何快速开发低门槛的嵌入式AI应用,特别适合初学者和嵌入式开发者。

x8y9z0的博客 1146

LeetCode python-1122.数组的相对排序

LeetCode python-1122.数组的相对排序 先看题目: (题目来力扣网站) 思路: 对arr1分两次排序,①按照arr2的顺序进行排序;②arr1中不在arr2中的元素进行升序排列 对arr2,因为arr2不重复且每个元素都在arr1中,故通过遍历arr2,将arr2中的元素存储到ans中 第一步:通过遍历arr1,计算出arr1中每个元素的个数,存储在arr中(arr是一个列表,...

weixin_43675940的博客 351

双三相电机控制避坑指南:为什么你的SVPWM谐波大?四矢量调制实战解析

本文深入解析双三相电机控制中SVPWM谐波大的问题,并提供四矢量调制实战方案。通过分析谐波来源、四矢量调制原理及工程实现步骤,显著降低电流THD至3-5%,提升系统效率2.3个百分点。特别适合需要优化电机控制的工程师参考。

weixin_30645617的博客 398

LeetCode 1122. 数组的相对排序:JavaScript 计数排序解法

题目链接LeetCode1122: https://leetcode-cn.com/problems/relative-sort-array首先我们一起来看题目:解题思路这是一道排序的...

LeviDing的博客 400

Cadence OrCAD Capture软件启动过程卡死且无法恢复的解决方法

如下图所示Cadence OrCAD Capture软件在启动后出现卡死的现象,且等待后无法自动恢复,需要强行关闭,再次启动依然卡死。

fydar的博客 4045

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出将AdaFocalLoss损失函数应用于YOLO26模型优化,有效提升小目标检测性能。AdaFocalLoss通过目标尺寸感知机制和IoU引导的动态调节,自动调整训练权重和聚焦程度,解决了样本不平衡问题。相比传统损失函数,它无需手动调参,能增强训练稳定性,在多尺度、复杂场景下表现优异。文章详细介绍了AdaFocalLoss的原理、优势及实现方法,并提供了代码集成指南。实验表明该方法能显著提升检测精度和鲁棒性,特别适用于小目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 337

LeetCode1122. 数组的相对排序(Java)

题目: 给你两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例: 代码: 解法一 /* 思路: 利用类似计数排序的思路 先计数排序(计数排序清查看 cs...

inferno_devil的博客 928

嵌入式工程师必学(9):USB 3.0协议理解

USB3.0和USB2.0相比,在线缆上从4根线(Vbus、GND、D+、D-)变为了8根线(Vbus、GND、D+、D-、SSRX+\SSRX-\SSTX+\SSTX-),可见增加的4根线都是和超速相关的,新增加的超速有两类,分别为:超速Gen1(5.0Gbps),超速+Gen2(10Gbps),还兼容USB2.0的3类速率:low-speed(1.5Mbps),full-speed(12Mbps),andhigh-speed(480Mbps)。从设计可以看出,USB3....

码农17年的博客 1万+

Leetcode 1122.数组的相对排序(Relative Sort Array)

Leetcode 1122.数组的相对排序 1 题目描述(Leetcode题目链接)   给你两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3

qq_39378221的博客 273

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LeetCode_1122_数组的相对排序

题目链接 https://leetcode-cn.com/problems/relative-sort-array/ 解题思路 计数排序 首先用一个数组tmp,记录arr1中每个元素的出现次数 然后遍历数组arr2,当遍历到元素x时,就将tmp[x]个x加入到答案中,并将tmp[x] = 0. 当遍历结束时,所有在arr2中出现过的元素就已经有序了 此时还剩下没有在arr2中出现过的元素,因此我们还需要对整个数组tmp进行依次遍历 当遍历到元素x时,如果tmp[x] != 0,我们就将tmp[x]个x

Fitz的博客 251

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

leetcode 1122.数组的相对排序

那么结果数组中就会放入一个2,然后计数数组中2的计数就会-1,直到计数数组中的2频率为0才会放入新的数字。然后创建一个计数数组,用来记录所有数字出现的频率,而计数数组的下标就是值(频率)的数字。第二个循环,把所有的1和2数组中重复的数字按照2的顺序排列然后放入结果数组。因为知道了1数组肯定比2数组长,所以结果数组长度定为1数组的长度。把2号数组中不存在的数字按照升序放入结果数组中。count[1] = 2表示数字1出现了2次。第一个循环是用来记录频率的。比如arr2[0] = 2。

qq_73919487的博客 295

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode 1122. 数组的相对排序

目录结构 1.题目 2.题解 1.题目 给你两个数组,arr1 和arr2, arr2中的元素各不相同 arr2 中的每个元素都出现在arr1中 对 arr1中的元素进行排序,使 arr1 中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19] ...

HarvestWu的博客 268

【Leetcode 1122 】 数组的相对排序 —— 哈希表

给你两个数组,arr1和arr2arr2中的元素各不相同,arr2中的每个元素都出现在arr1中。对arr1中的元素进行排序,使arr1中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。

Caoshuang_的博客 345

【LeetCode】1609. 奇偶树、1122. 数组的相对排序

作者:小卢专栏:《Leetcode》喜欢的话:世间因为少年的挺身而出,而更加瑰丽。——《人民日报》

一个喜欢猫咪的程序员 901

LeetCode 1122. 数组的相对排序 C++代码——Leetcode刷题笔记+思路分享

LeetCode 1122. 数组的相对排序 本文总结了两个: 方法一为博主使用的方法,傻瓜式重写cmp()函数; 方法二使用了计数排序的思想,同LeetCode官方题解,写下来巩固一下~ 方法一:重写cmp() 之所以叫傻瓜式,因为我在cmp中把四种情况都列了出来,代码虽然清晰但并不是特别简洁~ 代码 class Solution { public: vector<int> relativeSortArray(vector<int>& arr1, vector

weixin_42989041的博客 373

leetcode1122. 数组的相对排序

文章目录题目:1122. 数组的相对排序基本思想:map 题目:1122. 数组的相对排序 给你两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,

yyf_blog 736

力扣题解| 1122. 数组的相对排序

1122. 数组的相对排序 给你两个数组,arr1和arr2, arr2中的元素各不相同 arr2中的每个元素都出现在arr1中 对arr1中的元素进行排序,使arr1中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19] 提示: arr...

KevinBrain的博客 498

【LeetCode】1122. Relative Sort Array 数组的相对排序(Easy)(JAVA)

【LeetCode】1122. Relative Sort Array 数组的相对排序(Easy)(JAVA) 题目地址: https://leetcode.com/problems/relative-sort-array/ 题目描述: Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all elements in arr2 are also in arr1. Sort the elements of arr1 s

qq_16927853的博客 217

python-leetcode-1122. 数组的相对排序

这个方法的时间复杂度为 O(N log N),其中 N 是。很长,这种方法依然高效。你可以试试看是否符合你的需求!可以使用 Python 来解决这个问题。里的元素,并按升序排序后加入结果列表。中的元素加入结果列表,并减少计数。中每个元素的出现次数。

Lucy_wzw的博客 379

1122.数组的相对排序_力扣

问题描述: 给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/relative-sort-array著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路: 直接

aidiots的博客 920
上一篇: Leetcode1128. 等价多米诺骨牌对的数量
下一篇: Leetcode 第 368 场周赛题解
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值