【leetcode】1122. 数组的相对排序(relative-sort-array)(模拟)[简单]

215 篇文章 0 订阅
66 篇文章 0 订阅
这篇博客介绍了如何利用计数排序的思想解决LeetCode上的一个问题——相对排序数组。作者首先阐述了问题背景,然后详细解释了通过建立哈希表进行离散化和计数,以及遍历排序过程来实现解决方案的步骤。在时间复杂度分析中,指出最坏情况下的复杂度为O(max(nlogn,m)),其中n和m分别是两个输入数组的长度。最后,给出了AC代码实现。
摘要由CSDN通过智能技术生成

链接

https://leetcode-cn.com/problems/relative-sort-array/

耗时

解题:12 min
题解:12 min

题意

给你两个数组,arr1 和 arr2,

  • arr2 中的元素各不相同
  • arr2 中的每个元素都出现在 arr1 中

对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

思路

计数排序的思想。

用哈希表做离散化,计数 arr1 中每个元素出现的数量。然后遍历 arr2,对于 arr2 中的每个元素,按照哈希表记录的 arr1 中这个元素的数量,把这么多个这个元素放入结果中,并用哈希表记录 arr2 中出现过的元素。最后遍历记录 arr1 元素数量的哈希表,如果哈希表中遍历到的元素没在 arr2 中出现过,则按照这个元素的数量把这个元素放入一个临时数组,待遍历结束后,对临时数组进行排序,并将临时数组的元素放在结果的末尾。

时间复杂度:最坏 O ( m a x ( n l o g n , m ) ) O(max(nlogn, m)) O(max(nlogn,m)) n 是 arr1 的长度,m 是 arr2 的长度

AC代码

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        unordered_map<int, int> cnt;
        for(auto x : arr1) {
            cnt[x]++;
        }
        vector<int> ans;
        unordered_set<int> flag;
        for(auto x : arr2) {
            for(int i = 0; i < cnt[x]; ++i) {
                ans.push_back(x);
            }
            flag.insert(x);
        }
        vector<int> res;
        for(auto x : cnt) {
            if(flag.count(x.first)) continue;
            for(int i = 0; i < x.second; ++i) {
                res.push_back(x.first);
            }
        }
        sort(res.begin(), res.end());
        ans.insert(ans.end(), res.begin(), res.end());
        return ans;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值