1 from collections import Counter 2 3 class Solution: 4 def rearrangeBarcodes(self, barcodes: 'List[int]') -> 'List[int]': 5 n = len(barcodes) 6 c = Counter(barcodes) 7 sc = sorted(c.items(),key = lambda x:-x[1]) 8 9 kk = [] 10 for te in sc: 11 k = te[0] 12 v = te[1] 13 kk.extend([k] * v) 14 15 ind = 0 16 result = [0] * n 17 #先插入偶数位 18 even = 0 19 for i in range(n//2): 20 result[even] = kk[ind] 21 ind += 1 22 even += 2 23 24 #处理末尾数字 25 if n%2==1: 26 result[even] = kk[ind] 27 ind += 1 28 29 #插入奇数位 30 odd = 1 31 for i in range(n//2): 32 result[odd] = kk[ind] 33 ind += 1 34 odd += 2 35 36 return result
思路,将数组中的元素按照出现次数,从大到小排序,将其展开成按照次数排列的数组。
例如[7,7,7,8,5,7,5,5,5,8],展开成[7,7,7,7,5,5,5,5,8,8]或者[5,5,5,5,7,7,7,7,8,8]。
然后遍历这个展开数组,将其中的元素先插入偶数位(0,2,4,6......),再插入奇数位(1,3,5,7......)。
最终得到的结果就是任意相邻元素都不相同的数组。