1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现

给定一个仓库中的一排条形码,需要重新排列这些条形码,使得任意相邻的两个条形码不相等。通过使用C++的unordered_map记录每个条形码的数量,然后用priority_queue进行堆排序,每次尝试在不违反相邻不相等的条件下输出最大值的条形码。当无法直接输出最大值时,寻找下一个可输出的条形码。该问题有多种解决方案,本解答提供了一种使用堆的C++实现。

1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现

题目表述

在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。

请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

样例

示例 1:

输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]
示例 2:

输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]

条件

1 <= barcodes.length <= 10000
1 <= barcodes[i] <= 10000

思路

先通过unordered_map记录各个数出现的个数,然后通过priority进行堆排序,每次在可允许输出的情况下(前一个数不是当前最大数||当前为空)先输出最大值。

注意点

ac代码

c++:
class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
             unordered_map<int,int> number_time;
             vector<int> result;
             for(auto x:barcodes)
                number_time[x]++;
             priority_queue<pair<int,int>> members;
             for(auto &x:number_time)
                members.push({x.second,x.first});
             while(members.size()){
                auto now = members.top();
                //answer writing
                //auto [x,cx] = members.top();
                members.pop();
                // cout<<now.first<<"  "<<now.second<<" ";
                if(result.empty()||now.second!=result[result.size()-1])//can sit the biggest member
                {
                    result.push_back(now.second);
                    now.first--;
                    
                }
                else{
                    auto nowNext = members.top();
                    members.pop();
                    result.push_back(nowNext.second);
                    nowNext.first--;
                    if(nowNext.first>0)
                    members.push(nowNext);
                }
                if(now.first>0)
                members.push(now);
                // cout<<"resultSize:"<<result.size()<<endl;
             }
             return result;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值