【每日一题/哈希表运用题】1054. 距离相等的条形码

news2024/11/27 21:40:56

⭐️前面的话⭐️

本篇文章介绍【距离相等的条形码】题解,题目标签【哈希表】, 【贪心】,【优先级队列】,展示语言c++/java。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年5月14日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

  • ⭐️1054. 距离相等的条形码⭐️
    • 🔐题目详情
    • 💡解题思路
    • 🔑源代码
  • 🌱总结


封面


⭐️1054. 距离相等的条形码⭐️

🔐题目详情

1054. 距离相等的条形码

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

💡解题思路

思路1: 利用哈希表计数,然后将哈希表转换为数组,按照频率从高到低进行排序,将元素按照隔空遍历的方式进行插入。

思路2:

第一步,使用哈希表计数。

第二步,将元素和数量绑定放入优先级队列当中。

第三步,每次取出出现次数最多的元素,和次多的元素插入到答案数组。

🔑源代码

思路1: 利用哈希表计数,然后将哈希表转换为数组,按照频率从高到低进行排序,将元素按照隔空遍历的方式进行插入。

代码:

c++

class Solution {
public:
    static bool cmp(const pair<int, int>& e1, const pair<int, int>& e2) 
    {
        if (e1.first != e2.first) return e1.first > e2.first;
        else return e1.second < e2.second;
    }
    vector<int> rearrangeBarcodes(vector<int>& barcodes) 
    {
        int size = barcodes.size();
        //哈希表
        unordered_map<int, int> cnt;
        //统计每个数字出现的数量
        for (int x : barcodes) 
        {
            cnt[x]++;
        }
        //排序,模拟隔一个数插入一个数
        vector<pair<int, int>> elems;
        for (auto x : cnt) 
        {
            elems.push_back({x.second, x.first});
        }

        //排序
        sort(elems.begin(), elems.end(), cmp);
        //模拟隔空插入
        int index = 0;
        vector<int> ans(size);
        int ans_index = 0;
        while (index < elems.size()) 
        {
            //优先插入元素个数最多的元素
            if (elems[index].first > 0) 
            {
                ans[ans_index] = elems[index].second;
                elems[index].first--;
                ans_index += 2;
                if (ans_index >= size) ans_index = 1;
            } else {
                index++;
            }
        }
        return ans;
    }
};

java

class Solution {
    public int[] rearrangeBarcodes(int[] barcodes) {
        int size = barcodes.length;

        //哈希表计数
        Map<Integer, Integer> map = new HashMap<>();
        for (int x : barcodes) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        //转换为数组进行排序
        List<int[]> list = new ArrayList<>();
        for (Integer x : map.keySet()) {
            list.add(new int[]{map.get(x), x});
        }
        //排序
        Collections.sort(list, (a, b) -> {
            if (b[0] != a[0]) return b[0] - a[0];
            else return a[1] - b[1];
        });
        //模拟隔空插入
        int index = 0;
        int[] ans = new int[size];
        int ansIndex = 0;
        while (index < list.size()) {
            if (list.get(index)[0] > 0) {
                ans[ansIndex] = list.get(index)[1];
                ansIndex += 2;
                list.get(index)[0]--;
                if (ansIndex >= size) ansIndex = 1;
            } else index++;
        }
        return ans;
    }
}

思路2:

第一步,使用哈希表计数。

第二步,将元素和数量绑定放入优先级队列当中。

第三步,每次取出出现次数最多的元素,和次多的元素插入到答案数组。

代码:

c++

class Solution {
public:
    static bool cmp(const pair<int, int>& e1, const pair<int, int>& e2) 
    {
        if (e1.first != e2.first) return e1.first > e2.first;
        else return e1.second < e2.second;
    }
    vector<int> rearrangeBarcodes(vector<int>& barcodes) 
    {
        int size = barcodes.size();
        //哈希表计数
        unordered_map<int, int> hash_map;
        for (int x : barcodes) hash_map[x]++;
        //加入优先级队列,大根堆
        priority_queue<pair<int, int>> pq;
        for (auto x: hash_map) pq.push({x.second, x.first});
        //每次取出现频率最高的数插入
        vector<int> ans;
        while (pq.size() > 0) 
        {
            pair<int, int> top1 = pq.top(); pq.pop();
            if (pq.size() == 0) 
            {
                ans.push_back(top1.second);
                continue;
            }
            pair<int, int> top2 = pq.top(); pq.pop();
            ans.push_back(top1.second);
            ans.push_back(top2.second);

            top1.first--; top2.first--;
            if (top1.first > 0) pq.push(top1);
            if (top2.first > 0) pq.push(top2);
        }
        return ans;
    }
};

java

class Solution {
    public int[] rearrangeBarcodes(int[] barcodes) {
        //计数
        HashMap<Integer, Integer> hash = new HashMap<>();
        for (int x : barcodes) hash.put(x, hash.getOrDefault(x, 0) + 1);
        //放入优先级队列,使用大根堆
        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> {
            if (a[0] != b[0]) return b[0] - a[0];
            else return a[1] - b[1];
        });
        for (int x : hash.keySet()) {
            pq.offer(new int[]{hash.get(x), x});
        }
        int[] ans = new int[barcodes.length];
        int index = 0;
        while (!pq.isEmpty()) {
            int[] top1 = pq.poll();
            if (pq.isEmpty()) {
                ans[index++] = top1[1];
                continue;
            }
            int[] top2 = pq.poll();
            ans[index++] = top1[1];
            ans[index++] = top2[1];

            top1[0]--;
            top2[0]--;
            if (top1[0] > 0) pq.offer(top1);
            if (top2[0] > 0) pq.offer(top2);
        }

        return ans;
    }
}

🌱总结

贪心,哈希表计数,优先级队列。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络复习】第四章 网络层 2

源主机网络层的主要工作 路由器网络层的主要工作 目的主机网络层的主要工作 网络层提供的服务 o 屏蔽底层网络的差异&#xff0c;向传输层提供一致的服务 虚电路网络 o 虚电路网络提供面向连接的服务 n 借鉴了电路交换的优点 n 发送数据之前&#xff0c;源主机和目的主机…

MTK耳机识别

MTK耳机检测分为Eint only和EintAccdet 其中主流的是Eint Accdet(multi-key)。 图为MTK 耳机相关电路图的主要部分。 其中&#xff0c;左右声道的33pF主要滤除TDD干扰。串的10R100nf下地电容为低通滤波器。磁珠主要影响的是Fm以及音频THD性能。 Eint&#xff1a;检测耳机是否…

网络基础知识(3)——初识TCP/IP

首先给大家说明的是&#xff0c;TCP/IP 协议它其实是一个协议族&#xff0c;包含了众多的协议&#xff0c;譬如应用层协议 HTTP、 FTP、MQTT…以及传输层协议 TCP、UDP 等这些都属于 TCP/IP 协议。 所以&#xff0c;我们一般说 TCP/IP 协议&#xff0c;它不是指某一个具体的网络…

Casdoor 开始

Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录&#xff08;SSO&#xff09;身份验证平台&#xff0c;简单来说&#xff0c;就是 Casdoor 可以帮你解决用户管理的难题&#xff0c;你无需开发用户登录、注册等与用户鉴权相关的一系列功能&#xff0c;只需几个步骤进行…

C++多线程中共享变量同步问题

目录 1、互斥量 &#xff08;1&#xff09;std::mutex &#xff08;2&#xff09;std::recursive_mutex &#xff08;3&#xff09;std::timed_mutex 2、锁管理器 &#xff08;1&#xff09;std::lock_guardlk &#xff08;2&#xff09;std::unique_locklk &#xff0…

掌控MySQL并发:深度解析锁机制与并发控制

前一篇MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC 讲了事务在并发执行时可能引发的一致性问题的各种现象。一般分为下面3种情况&#xff1a; 读 - 读情况&#xff1a;并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响&#xff0c;不会引起什么问题&…

【C++】C++中的多态

目录 一.多态的概念二.多态的定义及实现2.1虚函数2.2虚函数的重写虚函数重写的两个例外 2.3多态的构成条件2.4C11 override 和final2.5重载、重写、隐藏的对比 三.抽象类3.1概念3.2接口继承和实现继承 四.多态的原理4.1虚函数表4.2多态的原理(1)代码分析(2)清理解决方案 4.3动态…

MySQL高阶语句与连接

目录 高级查询selectDISTINCTWHEREAND ORINBETWEEN通配符与likeORDER BY数学函数聚合函数字符串函数mysql进阶查询GROUP BYHAVING别名子查询EXISTS连接查询inner join(内连接)left join(左连接)right join(右连接)自我连接 高级查询 实验准备&#xff1a; 第一张表&#xff1a…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

call to non-‘constexpr‘ function

文章目录 call to non-constexpr function概述备注END call to non-‘constexpr’ function 概述 在尝试迁移 openpnp - Smoothieware project 从gcc命令行 MRI调试方式 到NXP MCUXpresso工程. 在加了头文件路径后, 还有一些语法错误. 这和编译器语法有关系. 在运行BuildShe…

阿里云服务器部署flask项目「gunicorn + nginx + 支持https」

最近做了一个微信小程序&#xff0c;使用 flask 实现了对应的后台&#xff0c;上线需要部署到服务器上&#xff0c;之前只是了解并没有全链路试过&#xff0c;靠着网上的资料最终完成部署上线&#xff0c;但中间遇到了较多的一些问题&#xff0c;网上的资料也比较零碎&#xff…

WPF MaterialDesign 初学项目实战(2)首页导航栏样式

其他内容 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 WPF MaterialDesign 初学项目实战&#xff08;1&#xff09;首页搭建 MaterialDesign 确保运行了初学项目实战&#xff08;0&#xff09; MaterialDesign给我们提供了很多的样式库&…

微服务框架【笔记-Nacos环境隔离】

Nacos注册中心 环境隔离 - namespace Nacos 中服务存储和数据存储的最外层都是一个名为namespace的东西&#xff0c;用来做最外层隔离 Nacos默认的命名空间&#xff1a; 创建命名空间复制命名空间ID启动Orderservice服务&#xff0c;在nacos服务列表可以看到环境隔离之后的服…

vue实现电梯锚点导航

1、目标效果 最近喝了不少的咖啡、奶茶&#xff0c;有一个效果我倒是挺好奇怎么实现的&#xff1a; &#xff08;1&#xff09;点击左侧分类菜单&#xff0c;右侧滚动到该分类区域 &#xff08;2&#xff09;右侧滑动屏幕&#xff0c;左侧显示当前所处的分类区域 这种功能会出现…

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

XDC约束技巧 之 I/O篇 (上)

《XDC约束技巧之时钟篇》中曾对I/O约束做过简要概括&#xff0c;相比较而言&#xff0c;XDC中的I/O约束虽然形式简单&#xff0c;但整体思路和约束方法却与UCF大相径庭。加之FPGA的应用特性决定了其在接口上有多种构建和实现方式&#xff0c;所以从UCF到XDC的转换过程中&#x…

都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平

一、博弈Ai&#xff1a;GPT3.5版 演示&#xff1a;https://chat.bo-e.com/ 1、充当英语发言助手 评分&#xff1a;10分 总结&#xff1a;完整满足了指令需求 2、充当英汉互译器 评分&#xff1a;8分 总结&#xff1a;基本满足了我的指令需求。但是有点啰嗦&#xff0c;扣…

MySQL---视图(定义、修改、更新、重命名、删除)

1. 定义视图 视图&#xff08;view&#xff09;是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命 名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中只存放了…

SIR模型与R模拟

SIR病毒模型R模拟 文章目录 SIR病毒模型R模拟[toc]1.SIR病毒模型2.R模拟 1.SIR病毒模型 SIR病毒模型的的三个字母分别为病毒传播过程中的三种状态&#xff0c;其中 S&#xff0c;表示易感染者&#xff0c;即没有被感染病毒的人群I&#xff0c;表示已感染者&#xff0c;即被感…

Spring_jdbcTemplate基本使用

文章目录 一、导入spring-jdbc和spring-tx坐标二、创建数据库表和实体在applicationContext.xml中配置连接池和JdbcTemplate在test数据库中创建account表 三、创建JdbcTemplate对象四、执行数据库操作 一、导入spring-jdbc和spring-tx坐标 <dependency><groupId>o…