加载中...
剑指 Offer II 075-数组相对排序
发表于:2021-12-03 | 分类: 简单
字数统计: 528 | 阅读时长: 2分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/0H97ZC

中文题目

给定两个数组,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]

 

提示:

  • 1 <= arr1.length, arr2.length <= 1000
  • 0 <= arr1[i], arr2[i] <= 1000
  • arr2 中的元素 arr2[i] 各不相同
  • arr2 中的每个元素 arr2[i] 都出现在 arr1 中

 

注意:本题与主站 1122 题相同:https://leetcode-cn.com/problems/relative-sort-array/ 

通过代码

高赞题解

计数排序

题目中明确数组内数字的范围为 0 ~ 1000,据此可以考虑使用计数排序。首先使用一个长度为 1001 的数组 counts 统计数组 arr1 内每个数字的出现次数,之后根据题目要求先排序数组 arr2 内出现的数字,最后排序 counts 内剩下的数字。

由于题目中已经明确辅助数组的长度,所以空间复杂度可以认为是 O(1),若数组 arr1 和 arr2 的长度分别为 m 和 n,那么算法的总时间复杂度为 O(n+m)。

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        vector<int> counts(1001, 0);
        for (auto& n : arr1) {
            counts[n]++;
        }

        int i = 0;
        // 排序 arr2 内的数字
        for (auto& n : arr2) {
            while (counts[n] > 0) {
                arr1[i++] = n;
                counts[n]--;
            }
        }
        // 排序剩下的数字
        for (int j = 0; j < counts.size(); ++j) {
            while (counts[j] > 0) {
                arr1[i++] = j;
                counts[j]--;
            }
        }
        return arr1;
    }
};

统计信息

通过次数 提交次数 AC比率
3919 5490 71.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
剑指 Offer II 074-合并区间
下一篇:
剑指 Offer II 076-数组中的第 k 大的数字
本文目录
本文目录