【无标题】

距离相等的条形码 LeedCode

题目描述

在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。

请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

示例 1:

输入:barcodes = [1,1,1,2,2,2] 输出:[2,1,2,1,2,1]
示例 2:
输入:barcodes = [1,1,1,1,2,2,3,3] 输出:[1,3,1,3,2,1,2,1]

解答

class Solution:
    def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
        count = Counter(barcodes)
        q=[]
        for x, cx in count.items():
            heapq.heappush(q, (-cx, x))
        res = []
        while len(q)>0:
            cx, x=heapq.heappop(q)  # 弹出最小的键值对
            #res为空或者res当前最后的键值对不是当前最小值
            if len(res)==0 or res[-1] !=x: 
                #直接加到res
                res.append(x)
                #如果弹出后此元素数量还有剩余,
                #把此元素加入res后的剩余数量再加入到堆中
                if cx<-1:
                    heapq.heappush(q, (cx+1, x))
            #res不为空且res当前最后的键值对和当前最小值一样
            else :
                #弹出第二小的键值对
                cy, y=heapq.heappop(q)
                #把值加入res
                res.append(y)
                #如果弹出后此元素数量还有剩余,
                #把此元素加入res后的剩余数量再加入到堆中
                if cy <-1:
                    heapq.heappush(q, (cy+1, y))
                #把x重新放回最小堆中
                heapq.heappush(q,(cx, x))
        return res

大佬的分析

计数–>按计数排序–>分为两组–>交替重组®–>返回

class Solution:
    def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
        # n为长度, cnt统计每个元素个数
        n, cnt=len(barcodes), Counter(barcodes)
        # 排序,lamdba函数表示以个数作比较对元素排序
        barcodes.sort(key = lambda x: (cnt[x], x))
        # 将数组分左右两组并交替重组
        #下标为奇数被分配给左边数组,下标为偶数被分配给右边数组
        barcodes[::2], barcodes[1::2] = barcodes[n>>1:], barcodes[:n>>1]
        #返回
        return barcodes

ps:lambda函数用法:参考Python 之 lambda 函数完整详解 & 巧妙运用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值