leetcode--1122.数组的相对排序

问题描述:
在这里插入图片描述
在这里插入图片描述
示例

输入: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]

思路

这道题的重点在于需要统计arr2中的数字在arr1中出现的次数以及未出现的arr1中数字。这样操作很麻烦。不容易实现。
但是,提示中描述了arr1.length<=1000,所以在这里可以利用快速排序的思想。创建一个新数组copy,长度为1001,然后每遍历arr1数组中的一个元素,copy数组对应的角标的元素值+1,即:copy[arr1[i]]++,再将arr2.length作为for循环条件,在for循环中再进行while循环,条件是:如果arr2对应的元素值在copy中大于0,那么就将元素提取出来,放入arr1数组中。每从copy数组中提取一个元素,对应的角标的值-1.最后循环完就将所有arr2在arr1中出现的数字按照相对顺序放在了arr1中,最终只需要再遍历copy数组,如果数组的元素值有大于1的,依次将元素值提取出来,补充在arr1数组后面,随后返回arr1这个数组即可。

java代码

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int[] copy = new int[1001];
        for(int i=0;i<arr1.length;i++){
            copy[arr1[i]]++;
        }
        int flag=0;
        for(int j=0;j<arr2.length;j++){
            while(copy[arr2[j]]>0){
            arr1[flag++]=arr2[j];
            copy[arr2[j]]--;
        }
        }
        for(int k=0;k<1001;k++){
            while(copy[k]>0){
                arr1[flag++]=k;
                copy[k]--;
            }
        }
        return arr1;
    }
}

在这里插入图片描述

发布了73 篇原创文章 · 获赞 7 · 访问量 3569

猜你喜欢

转载自blog.csdn.net/weixin_43801718/article/details/103463280