题目:
给你两个数组,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 中
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-sort-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* 桶排序法
*/
import java.util.Arrays;
public class RelativeSortArray {
public static int[] relativeSortArray(int[] arr1,int[] arr2 ){
//题目中范围是0-1000的数字,所以构建1001个桶,其下标代表数组中的元素
int[] bucket = new int[1001];
int[] ans = new int[arr1.length];
//把arr1中的数字,通过计数的方式,塞到对应的桶里
for(int i = 0; i < arr1.length;i++){
bucket[arr1[i]]+=1;
}
int j = 0;
//把这些桶根据arr2的顺序排列好,桶内部无所谓,因为数字都是相同的;每次排完一个桶,就把桶清空继续排;由于arr1比arr2多出来的数字放在末尾升序排列,所以这部分也不用管,最后和前面一起倒出来就可以了
for(int i = 0;i< arr2.length;i++){
for(int k = 0;k<bucket[arr2[i]];k++){
ans[j] = arr2[i];
j++;
}
bucket[arr2[i]]=0;
}
//把排列好的桶一起倒出来,桶里的数字是几,那么这个元素就重复几次,直到1001个桶倒完(虽然后面都是0)
for(int i = 0;i<bucket.length;i++){
for(int k = 0;k<bucket[i];k++){
ans[j]=i;
j++;
}
}
return ans;
}
public static void main(String[] args) {
int[] arr1= {2,3,1,3,2,4,6,7,9,2,19};
int[] arr2={2,1,4,3,9,6};
System.out.println(Arrays.toString(relativeSortArray(arr1,arr2)));//答案为:[2,2,2,1,4,3,3,9,6,7,19]
}
}