这是我参与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 <= 10000 <= arr1[i], arr2[i] <= 1000arr2中的元素arr2[i]各不相同arr2中的每个元素arr2[i]都出现在arr1中
思路
-
由于提示中已经说了
arr2中的每个元素各不相同,那么我们可以用一个map来记录arr2中的每个元素出现的位置; -
遍历
arr2,把节点的值arr2[i]和节点的位置i建立起映射关系存放进map中; -
用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;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。