LeetCode 1054. 距离相等的条形码

  1. 距离相等的条形码

在一个仓库里,有一排条形码,其中第 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;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值