作业11:数组的相对排序

题目:

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

上一篇:重写hashCode()和equals()方法


下一篇:C语言-数组相关习题(1)(含冒泡排序)