每日一题20201114(1122. 数组的相对排序)

简介: 数组的相对排序方法

15.jpg

image.png

重点


首先注意几个重点:
1. arr1和arr2里最大的元素不会超过1000
2. arr2里面没有重复的元素
3. arr2里面每个元素必定在arr1里面出现


思路


1. 先创建一个大小为1001的数组data用来存放arr1中每个元素出现的次数(因为最大值可能是1000),其实这里可以简化,只要这个数组的长度等于max(arr1)+1即可覆盖到所有arr1中的数字;
2. 创建一个大小为arr1的数组或者直接沿用arr1(因为arr1的信息已经被记录到data数组里面了)
3. 遍历arr2,去data中取出arr1中包含arr2元素的数量,分别插入这个新数组并把data里面arr2的相关数据都置为0,保证后续data中只有arr1中特有的元素。
4. 遍历data,把剩下的数据写到新数组。

方法一:

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        # 创建一个能容纳arr1最大值的数组
        data = [0] * (max(arr1)+1)
        # 存储arr1中的元素值和数量
        for a in arr1:
            data[a] += 1
        # 最终结果数组
        result = []
        # 把arr2的所有元素写入result数组
        for d in arr2:
            length = data[d]
            for x in range(length):
                result.append(d)
            data[d] = 0
        # i是data中剩余arr1数据的值,可能会有多个,所以需要插入n个i,当n等于0的时候代表n不存在或者n是arr2里的元素,直接continue
        for i, n in enumerate(data):
            if n == 0:
                continue
            for x in range(n):
                result.append(i)
        return result

优化(少用一个result数组,直接在arr1修改)

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        data = [0] * (max(arr1)+1)
        for a in arr1:
            data[a] += 1
        # 定义一个指针指向当前已经替换的元素
        i = 0
        for d in arr2:
            length = data[d]
            for x in range(i, i+length):
                arr1[x] = d
            i += length
            data[d] = 0
        for j, n in enumerate(data):
            if n == 0:
                continue
            for x in range(i, i+n):
                arr1[x] = j
            i += n
        return arr1

16.jpg

image.png




相关文章
|
18天前
|
算法 Java
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
34 0
每日一题《剑指offer》数组篇之统计数字在排序数组中出现的次数
|
18天前
|
算法 搜索推荐 API
LeetCode 912. 排序数组
LeetCode 912. 排序数组
29 0
|
18天前
|
Java
每日一题《剑指offer》数组篇之二维数组中的查找
每日一题《剑指offer》数组篇之二维数组中的查找
30 0
|
18天前
|
Java
每日一题《剑指offer》数组篇之数组中的逆序对
每日一题《剑指offer》数组篇之数组中的逆序对
29 0
每日一题《剑指offer》数组篇之数组中的逆序对
|
18天前
|
Java
每日一题《剑指offer》数组篇之数组中重复的数字
每日一题《剑指offer》数组篇之数组中重复的数字
39 0
每日一题《剑指offer》数组篇之数组中重复的数字
|
18天前
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
20 0
|
12月前
|
搜索推荐 Java
Leecode912. 排序数组
Leecode912. 排序数组
37 0
leetcode 912 排序数组
leetcode 912 排序数组
62 0
每日一题—— 按奇偶排序数组
每日一题—— 按奇偶排序数组
49 0
每日一题—— 按奇偶排序数组