难度:Easy
题目:
给你两个数组,
arr1
和arr2
,arr2
中的元素各不相同,arr2
中的每个元素都出现在arr1
中。对
arr1
中的元素进行排序,使arr1
中项的相对顺序和arr2
中的相对顺序相同。未在arr2
中出现过的元素需要按照升序放在arr1
的末尾。
示例 1:
输入: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]
示例 2:
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6] 输出:[22,28,8,6,17,44]
提示:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2
中的元素arr2[i]
各不相同arr2
中的每个元素arr2[i]
都出现在arr1
中
Related Topics
- 数组
- 哈希表
- 计数排序
- 排序
重点!!!解题思路
第一步:
明确解题手段,题中要求arr1按照arr2的顺序来输出,那么我们需要统计arr2中的元素在arr1中出现的次数,这样的话我们就需要使用计数排序。
第二步:
知道了arr2中元素在arr1中出现的次数,那么我们就可以对应着arr2来进行输出映射,当arr2遍历后,arr1剩余的部分依次输出
源码+讲解:
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] cnt=new int[1005]; //题中范围1000
for(int x:arr1) cnt[x]+=1; //统计arr1中每个元素出现的次数
int k=0;
for (int x:arr2){ //如果是arr2中的值就依次输出
while (cnt[x]-->0) arr1[k++]=x; //每次输出完要将值减小到<0 方便后续操作
}
for (int i=0;i<cnt.length;i++){ //遍历cnt数组,arr1中的剩余值要依次输出
while (cnt[i]-->0) arr1[k++]=i;
}
return arr1; //值都拷贝到arr1中 就不要开辟额外的存储空间了
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧