leetcode1054

 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......)。

最终得到的结果就是任意相邻元素都不相同的数组。

 

上一篇:LeetCode 328:奇偶链表 Odd Even Linked List


下一篇:二分查找小结