zoukankan      html  css  js  c++  java
  • 每日一题20201114(1122. 数组的相对排序)

    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
    

    image.png

  • 相关阅读:
    BZOJ 1101 莫比乌斯函数+分块
    BZOJ 2045 容斥原理
    BZOJ 4636 (动态开节点)线段树
    BZOJ 2005 容斥原理
    BZOJ 2190 欧拉函数
    BZOJ 2818 欧拉函数
    BZOJ 3123 主席树 启发式合并
    812. Largest Triangle Area
    805. Split Array With Same Average
    794. Valid Tic-Tac-Toe State
  • 原文地址:https://www.cnblogs.com/we8fans/p/14012931.html
Copyright © 2011-2022 走看看