在一个仓库里,有一排条形码,其中第 i
个条形码为 barcodes[i]
。
请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
示例 1:
输入:[1,1,1,2,2,2] 输出:[2,1,2,1,2,1]
示例 2:
输入:[1,1,1,1,2,2,3,3] 输出:[1,3,1,3,2,1,2,1]
提示:
1 <= barcodes.length <= 10000
1 <= barcodes[i] <= 10000
C++
class Solution {
public:
vector<int> rearrangeBarcodes(vector<int>& barcodes)
{
int n=barcodes.size();
map<int,int> tmp;
for(int i=0;i<n;i++)
{
tmp[barcodes[i]]++;
}
priority_queue<pair<int,int>> que;
for(auto it:tmp)
{
que.push(make_pair(it.second,it.first));
}
vector<int> res;
pair<int,int> se;
if(que.size())
{
se=que.top();
que.pop();
res.push_back(se.second);
se.first--;
}
while(que.size())
{
auto it=que.top();
que.pop();
res.push_back(it.second);
it.first--;
if(se.first>0)
{
que.push(se);
}
se=it;
}
return res;
}
};
python
import queue
class Solution:
def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
n=len(barcodes)
que=queue.PriorityQueue()
tmp={}
for i in barcodes:
if i not in tmp:
tmp[i]=1
else:
tmp[i]+=1
for key in tmp:
que.put([-tmp[key],key])
res=[]
if que.qsize():
se=que.get()
res.append(se[1])
se[0]+=1
while que.qsize():
it=que.get()
res.append(it[1])
it[0]+=1
if se[0]:
que.put(se)
se=it
return res