中文题目
给定两个数组,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% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|