[路飞]_程序员必刷力扣题: 1122. 数组的相对排序

121 阅读1分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

1122. 数组的相对排序

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

示例2:

输入: arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出: [22,28,8,6,17,44]

提示:

  • 1 <= arr1.length, arr2.length <= 1000
  • 0 <= arr1[i], arr2[i] <= 1000
  • arr2 中的元素 arr2[i]  各不相同 
  • arr2 中的每个元素 arr2[i] 都出现在 arr1 中

暴力+map

思路 由题可得,我们需要对arr1进行排序,但是存在于arr2中的元素需要按照arr2中元素出现的顺序进行排序,最后arr1剩余的不在arr2中的元素排在arr1的末尾,按照升序排序

所以我们首先需要知道arr1哪些元素存在于arr2中

这里我们用一个map对象来记录arr2中的元素map[arr2[i]] = 0

接下来统计arr1中存在于arr2中的元素的数量。 遍历arr1

  • 将map[item]不等于undefined的元素(这就是存在于arr2中的元素)的值+1,
  • 将map[item]等于undefined的元素(这是不存在arr2中的元素)暂存与temp数组中

接下来需要先对arr1中的存在于arr2中的所有元素进行排序,顺序按照arr2中的出现顺序

所以我们只需要对arr2进行遍历

  • 并且从map中得到该值的数量,放入arr1中的对应位置,所以这里需要一个index从0开始,每次index++
  • 当arr2遍历完毕,处理剩余的temp中的元素
  • 声明last和t,last代表arr1中末尾部分未排序的元素的首位,t代表temp中当前需要放入arr1中的元素下标
  • 遍历temp将temp[t]放入arr1[last],然后last和t都加一

最后返回arr1即可

var relativeSortArray = function (arr1, arr2) {
    var temp = [];
    var map = {}
    // 保存arr2中存在的元素
    for (var i = 0; i < arr2.length; i++) {
        var item = arr2[i]
        map[item] = 0
    }
    // 比那里arr1统计2中拥有的元素的数量
    for (var i = 0; i < arr1.length; i++) {
        var item = arr1[i]
        if (map[item] !== undefined) {
            map[item]++
        } else {
            temp.push(item)
        }
    }
    var index = 0
    // 从新放入新数组
    for (var i = 0; i < arr2.length; i++) {
        var item = arr2[i]
        while (map[item] > 0) {
            arr1[index] = item
            index++
            map[item]--
        }
    }
    temp.sort((a, b) => a - b)
    var last = arr1.length - temp.length
    var t = 0
    while(last<arr1.length){
        arr1[last] = temp[t]
        last++
        t++
    }
    return arr1
};