题目链接
解题思路
- 计数排序
- 首先用一个数组
tmp
,记录arr1
中每个元素的出现次数 - 然后遍历数组
arr2
,当遍历到元素x
时,就将tmp[x]
个x
加入到答案中,并将tmp[x] = 0
. - 当遍历结束时,所有在
arr2
中出现过的元素就已经有序了 - 此时还剩下没有在
arr2
中出现过的元素,因此我们还需要对整个数组tmp
进行依次遍历 - 当遍历到元素
x
时,如果tmp[x] != 0
,我们就将tmp[x]
个x
加入到答案中
AC代码
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int len1 = arr1.length;
int max = 0;
for (int item : arr1) max = Math.max(max, item);
int index = 0;
int[] tmp = new int[max + 1];
int[] ans = new int[len1];
for (int value : arr1) tmp[value]++;
for (int value : arr2) {
for (int j = 0; j < tmp[value]; j++) {
ans[index++] = value;
}
tmp[value] = 0;
}
for (int i = 0; i <= max; i++) {
for (int j = 0; j < tmp[i]; j++) {
ans[index++] = i;
}
}
return ans;
}
}
本地测试代码
package com.company;
import java.util.Arrays;
public class Solution_1122 {
public static int[] relativeSortArray(int[] arr1, int[] arr2) {
int len1 = arr1.length;
int max = 0;
for (int item : arr1) max = Math.max(max, item);
int index = 0;
int[] tmp = new int[max + 1];
int[] ans = new int[len1];
for (int value : arr1) tmp[value]++;
for (int value : arr2) {
for (int j = 0; j < tmp[value]; j++) {
ans[index++] = value;
}
tmp[value] = 0;
}
for (int i = 0; i <= max; i++) {
for (int j = 0; j < tmp[i]; j++) {
ans[index++] = i;
}
}
return ans;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(relativeSortArray(new int[]{2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19}, new int[]{2, 1, 4, 3, 9, 6})));
}
}