- 距离相等的条形码
在一个仓库里,有一排条形码,其中第 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
题解:
直接说的简单些,用数量少的数字插数量大的数字。
比如样例:
[1,1,1,1,1,2,2,2,2,3,3,3]
数量最多的为1,有5个,其次2有4个,3有3个。
定义5个动态数组然后一直循环装入数字:
第一轮:
pu[0]:1
pu[1]:1
pu[2]:1
pu[3]:1
pu[4]:1
第二轮:
pu[0]:1,2
pu[1]:1,2
pu[2]:1,2
pu[3]:1,2
pu[4]:1,3
第三轮:
pu[0]:1,2,3
pu[1]:1,2,3
pu[2]:1,2
pu[3]:1,2
pu[4]:1,3
然后再依次输出pu[0]到pu[4]如下:
1,2,3,1,2,3,1,2,1,2,1,3完全符合题目要求。
这个主要是方便解释怎么模拟实现,为什么这样可以呢,就是把数量多的全排开,数量少的不断向这些数字中添加分隔开,这样就保证了不会有相邻的数字一样了。
AC代码
class Solution {
public:
struct Node
{
int val,num;
};
vector<int>pu[10010];
vector<Node>q;
static int cmp(Node a1,Node a2)
{
return a1.num>a2.num;
}
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
sort(barcodes.begin(),barcodes.end());
Node t;
t.val=barcodes[0],t.num=1;
q.push_back(t);//储存每个元素和对应的出现数目
for(int i=1;i<barcodes.size();i++)
{
int n=q.size()-1;
if(q[n].val==barcodes[i])
q[n].num++;
else
{
t.val=barcodes[i];
t.num=1;
q.push_back(t);
}
}
sort(q.begin(),q.end(),cmp);//按数目多的排序在前
int n=q[0].num,id=0;
while(id<q.size())
{
for(int i=0;i<n;i++)
{
if(q[id].num==0)id++;
if(id>=q.size())break;
pu[i].push_back(q[id].val);
q[id].num--;
}
}
vector<int>res;
for(int i=0;i<n;i++)
res.insert(res.end(),pu[i].begin(),pu[i].end());
return res;
}
};