LeetCode_Java_数组的相对排序(题目+思路+代码)

LCR 075. 数组的相对排序 / 1122. 数组的相对排序

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

 思路:

        arr1有两种情况:

        1.长度为1,这种情况下只输出arr1就可以,不用进行排序

        2.长度大于1,这种情况就得根据arr2的位置进行排序

        第二种情况的思路如下:

        1.先创建一个长度为1001的数组

        2.遍历arr1的元素,利用数组conuts[num]++的方法计算arr1中每个元素出现的次数

        3.再遍历arr1每个元素出现的次数之后,将与arr2重叠的元素添加到arr1数组中,从前往后排

        4.重叠的元素排序完毕,接下来排序非重叠元素

        【在第二点中我们已经遍历arr1每个元素出现的次数,因此在第三步骤之后重叠的元素counts[num]次数为0,

        剩下的counts值大于0的都是非重叠元素,只要讲这些元素添加到arr1之后即可】

        5.返回arr1数组

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        if(arr1.length<=1)
            return arr1;
        int[] counts = new int[1001];
        //遍历arr1每个元素出现的次数
        for(int num : arr1){
            counts[num]++;
        }
        //将与arr2重叠的元素添加到arr1数组中
        int i = 0;
        for(int num : arr2){
            while(counts[num]>0){
                arr1[i] = num;
                i++;
                counts[num]--; //直到重叠次数为0,则继续遍历arr2数组
            }
        }
        //重叠的元素排序完毕,接下来排序非重叠元素
        for(int num = 0;num0){
                arr1[i] = num; //i的值延续重叠的元素添加到arr1数组完毕后的i值
                i++;
                counts[num]--; 
            }
        }
        return arr1;
    }
}

 

你可能感兴趣的:(力扣刷题,leetcode,算法,排序算法)