java - 1122. 数组的相对排序 - 最优解计数排序

该博客介绍了一种针对给定数组arr1和包含arr1子集的arr2,通过计数排序方法来保持arr1元素相对顺序与arr2相同的算法。首先创建一个1001大小的计数数组,遍历arr1记录每个元素出现次数,然后根据arr2遍历计数数组,将元素按顺序放入arr1,最后将剩余元素按升序放入arr1末尾。代码中展示了具体的实现过程。
摘要由CSDN通过智能技术生成

一、题目

* 给你两个数组,arr1 和arr2,arr2中的元素各不相同,arr2 中的每个元素都出现在arr1中。
* 对 arr1中的元素进行排序,使 arr1 中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。

* 示例 1:
* 输入: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]

二、思路

由于题目中数的范围[0,1000]不算很大,因此使用计数排序

1 首先申请一个大小为1001的hash数组,遍历arr1,arr1中的元素每出现一个,就在hash对应下标的元素累加
 如arr1当前元素为888,就hash[888]++
 这个循环结束后,hash数组变为arr1所有元素出现的次数


2 遍历arr2,对于arr2中的每个元素,将hash对应的下标值按计数个数依次存入arr1,每放一个计数要-1,直到放完计数为0
 如arr2第一个是8,hash[8]是6,就往arr1中放入6个8*   
 这个循环结束后,hash数组变为arr2中没有的元素所出现的次数


3 遍历hash数组,把剩下元素不为空的依次按计数个数存入arr1表尾
 由于是按hash索引顺序存放,因此放入的元素必然是有序的

三、代码

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int[] hashArray = new int[1001];
        for (int i = 0; i < arr1.length; i++) { // 计数数组
            hashArray[arr1[i]]++;
        }
        int flag = 0;
        for (int i = 0;i<arr2.length;i++){  //先按照arr2出现的顺序把arr1前一部分赋值
            while (hashArray[arr2[i]]>0){
                arr1[flag] = arr2[i];
                hashArray[arr2[i]]--;
                flag++;
            }
        }
        for (int i = 0;i<hashArray.length;i++){ //剩余元素按顺序加入arr1表尾
            while (hashArray[i]>0){
                arr1[flag] = i;
                hashArray[i]--;
                flag++;
            }
        }
        return arr1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值