1122 数组的相对排序(字典计数)

1. 问题描述:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-sort-array

2. 思路分析:

    从题目中可以知道这个实际上是哈希表的计数问题,我们可以计算出在arr1中出现在arr2数字中的次数,因为使用的是python语言所以可以使用字典来进行计数,可以直接使用collections.Counter(arr1)方法转化为字典进行计数,并且我们可以对出现在arr2中的数字进行删除这样,所以可以直接删除字典中出现在arr中的键,删除之后剩下来的就是没有出现在arr2中的,然后对其进行排序即可,并且在python中一个很方便的操作是可以直接对列表进行相加表示两个集合的并集最终返回并集的结果即可

3. 代码如下:

一开始写的:

import collections
from typing import List


class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        dic, res, behind = collections.Counter(arr1), list(), list()
        for cur in arr2:
            if cur in dic:
                for i in range(dic[cur]): res.append(cur)
        # 检查不存在于arr2中的数据
        for key in dic.keys():
            if key not in arr2:
                for i in range(dic[key]): behind.append(key)
            else:
                continue
        behind.sort()
        # 返回两个集合的交集
        return res + behind

在检查的时候进行删除元素:

import collections


class Solution(object):
    def relativeSortArray(self, arr1, arr2):
        # 将arr1 counter计数,按照arr2来取
        dic, res = collections.Counter(arr1), list()
        # 按照arr2将arr1的元素存入li
        for cur in arr2:
            if cur in dic:
                for i in range(dic[cur]):
                    res.append(cur)
            # 被存的元素删除掉
            del dic[cur]
        print(dic)
        # 剩下的元素排序放到末尾
        res += sorted(dic.elements())
        return res

 

你可能感兴趣的:(领扣)