<LeetCode每日一题>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.length, arr2.length <= 1000
● 0 <= arr1[i], arr2[i] <= 1000
● arr2 中的元素 arr2[i] 各不相同
● arr2 中的每个元素 arr2[i] 都出现在 arr1 中
问题分析
在看上述例子时,我的做法是从arr2数组中依次取出每一个元素,寻找其在arr1中对应出现的次数,之后存入输出数组中,最后对于arr1中出现但arr2中没有的元素,依照升序存入。
代码实现

本题我利用了计数排序的思想,相关参考资料如下
什么是计数排序

步骤:
1、遍历arr1,更新res[]
2、遍历arr2,依次获取arr2中每一个元素的值和其在arr1中的出现次数,并存入输出数组ans[],并将其在res[]中的值致零。
3、遍历res[],对剩余res[]不为0的元素存入输出数组。

具体代码如下所示:

public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int []ans=new int[arr1.length];// res[]:res[]下标表示arr1中元素值,res[]值表示该值在arr1中出现的次数
        int res[]=new int[1001];//ans[]:输出数组
        int i2,j=0,t=0;
        int i1=0,k=0;
        for(i1=0;i1<arr1.length;i1++)
        {
            res[arr1[i1]]++;
        }
        for(i2=0;i2<arr2.length;i2++)
        {
            k=res[arr2[i2]];
            for(j=0;j<k;j++)
            {
                ans[t++]=arr2[i2];
            }
            res[arr2[i2]]=0;
        }
        for(i1=0;i1<res.length;i1++)
        {
            k=res[i1];
            if(k!=0)
            {
                for(j=0;j<k;j++)
                {
                    ans[t++]=i1;
                }
            }
        }
        return ans;
    }

运行调试
在第一次提交时,我忽视了问题的提示条件,误写为int res[]=new int[1000];从而导致了数组越界。因限定条件有0 <= arr1[i], arr2[i] <= 1000。所以res下标最大值应为1000,故res数组长度应设为1001。
运行结果
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值