[前端]_一起刷leetcode 1122. 数组的相对排序

130 阅读2分钟

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

题目

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]

 

提示:

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

思路

  1. 由于提示中已经说了arr2中的每个元素各不相同,那么我们可以用一个map来记录arr2中的每个元素出现的位置;

  2. 遍历arr2,把节点的值arr2[i]和节点的位置i建立起映射关系存放进map中;

  3. 用js自带的sort方法进行排序,排序的时候我们要分四种情况:

    3.1 两个比较的元素都在arr2数组中,这时候根据map来查找它们在arr2中出现的位置,然后根据出现的位置先后进行排序即可;

    3.2 第一个元素在arr2数组中,第二个元素不在,这时候根据题意第一个元素应该排在前面,我们直接返回-1即可;

    3.3 第二个元素在arr2数组中,第一个元素不在,这时候第二个元素应该排在前面,我们直接返回1;

    3.4 两个元素都不在,这时根据两个元素本身的大小进行排序即可。

实现

/**
 * @param {number[]} arr1
 * @param {number[]} arr2
 * @return {number[]}
 */
var relativeSortArray = function(arr1, arr2) {
    // 记录arr2中每个元素出现的位置
    let map = new Map();
    for (let i = 0; i < arr2.length; i++) {
        map.set(arr2[i], i);
    }

    // 直接调用数组的排序方法了
    arr1.sort((a, b) => {
        // 如果两个都在arr2中出现
        if (map.has(a) && map.has(b)) {
            return map.get(a) - map.get(b);
        } else 
        // a在,b不在
        if (map.has(a)) {
            return -1;
        } else
        // b在,a不在
        if (map.has(b)) {
            return 1;
        } else {
            // 两个都不在
            return a - b;
        }
    });

    return arr1;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。