力扣(距离相等的条形码)

1054. 距离相等的条形码

提示

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

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

思路:

首先利用一个数组保存每个元素出现次数,即dp[i]表示i出现的次数。

然后先处理出现次数最多的元素,处理方法是从0开始,每隔两个存放一个该元素直到全部存完。

在处理完出现次数最多的元素后,对于其他元素,也是按照每间隔两个位置存放一个该元素的方法,当存放位置超过数组长度时,改为从1开始继续每间隔两个存放一个。最后就会得到所要求的数组。

重点是必须先存放出现次数最多的元素,极端情况下出现次数最多的元素可能是(n+1)/2个,此时相当于最后求出的数组,每间隔两个位置都有一个该元素,如果不先排该元素,则必定会在前面几个两两为一组的小组中没有一个该元素,则后面必定会出现该元素重复存放。(针对本方法来说!)。

对于出现的最大次数是(n+1)/2,是假设每两个相邻元素为一个小组,若没有重复,极端情况下是每个小组的第一个元素都是该元素,而最后一个小组可能只有一个元素,也可能有两个元素,因此是(n+1)/2.

复制代码
class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
       int n=0;
       for(auto e:barcodes)
       {
          n=max(n,e);
       }
       vector<int>dp(n+1,0);
       for(auto e:barcodes)
       {
        dp[e]++;
       }
       vector<int>ret(barcodes.size());
       //先处理最大的,其余随意
       int m=0;
       for(int i=0;i<dp.size();i++)
       {
           if(dp[i]>dp[m])
           {
            m=i;
           }
       }
       int l=0;
       while(dp[m])
       {
          ret[l]=m;
          l+=2;
          dp[m]--;
       }
       for(int i=0;i<dp.size();i++)
       {
          while(dp[i])
          {
             if(l>=ret.size())
             {
                l=0;
             }
             while(ret[l]!=0)
             {
                l++;
             }
             ret[l]=i;
             dp[i]--;
             l+=2;
          }
       }
      
      return ret;

    }
};
相关推荐
君义_noip2 小时前
CSP-J 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·csp 第一轮
WL_Aurora2 小时前
备战蓝桥杯国赛【Day 6】
python·算法·蓝桥杯
绛橘色的日落(。・∀・)ノ2 小时前
机器学习 逻辑回归
算法·机器学习·逻辑回归
测绘第一深情2 小时前
在vscode中使用codex教程(个人安装经验)
数据结构·ide·vscode·python·算法·计算机视觉·编辑器
Liangwei Lin2 小时前
LeetCode 41. 缺失的第一个正数
数据结构·算法·leetcode
海参崴-2 小时前
手写红黑树全流程学习总结
学习·算法
名字不好奇2 小时前
大模型如何“理解“人类语言:从符号到语义的飞跃
算法
小雅痞2 小时前
[Java][Leetcode hard] 76. 最小覆盖子串
java·算法·leetcode
小O的算法实验室3 小时前
2026年IEEE TBD,面向大规模优化的随机矩阵粒子群算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
哭泣方源炼蛊3 小时前
AtCoder Beginner Contest 456 E补题(分层图 + 有向环检测 )
c++·算法·深度优先·图论·拓扑学