距离相等的条形码 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 函数完整详解 & 巧妙运用