刷leetcode [第一道] 数组的相对排序js解法

622 阅读1分钟

原文github地址

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

leet code地址原题

解法1

  • 首先区分两个数组中不同的元素,把不同的元素放入一个新的数组进行排序
  • 以arr2为原型对比arr1中相同的元素,如果相同则推入一个数组
  • 两个新的数组进行合并
  • 时间复杂度为 O(n^2)
var relativeSortArray = function(arr1, arr2) {
        let arr3=[]
        for(var i=0;i<arr1.length;i++){
            if(arr2.indexOf(arr1[i])<0){
                arr3.push(arr1[i])
            }
        }
        let arr = []
        for(var i=0;i<arr2.length;i++){
           for(var j=0;j<arr1.length;j++){
               if(arr2[i]===arr1[j]){
                   arr.push(arr1[j])
               }
           }
        }
        return arr.concat(arr3.sort((a,b)=>a-b))
};

解法2

  • 以arr2为原型,循环他的长度,然后每次都会弹出尾部一个元素,
  • 弹出的元素与arr1从后往前进行比较
  • 相等则推入一个新的数组,同时arr1删除掉相同的元素
  • 最后arr1只会剩下与arr2不同的元素了
  • 两个新的数组进行合并
var relativeSortArray = function(arr1, arr2) {
    let result = []

    while (arr2.length) {
        let i = arr1.length
        let target = arr2.pop()
        while (i--) {
            if (arr1[i] === target) {
                result.unshift(target)
                arr1.splice(i, 1)
            }
        }
    }
    return result.concat(arr1.sort((a, b) => a - b))
};

这只是其中一个思路,期待更好的解法