【Java 数据结构 & 算法】⚠️宁可累死自己, 也要卷死别人 18⚠️ 贪心算法

  • 概述
  • 贪心算法
  • 电台覆盖问题
  • 代码实现

概述

从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.

贪心算法

贪心算法 (Greedy Algorithm) 指的是在每一步选择中都采取在当前状态下最好或最优的选择, 从而希望导致结果是最好或最优的算法. 贪心算法锁得到的结果不一定是最优的结果, 但是都是相对近似最优的结果.

贪心算法的优缺点:

  • 优点: 贪心算法的代码十分简单
  • 缺点: 很难确定一个问题是否可以用贪心算法解决

电台覆盖问题

假设存在以下的广播台, 以及广播台可以覆盖的地区:

广播台 覆盖地区
K1 北京, 上海, 天津
K2 北京, 广州, 深圳
K3 上海, 杭州, 成都
K4 上海, 天津
K5 杭州, 大连

贪心算法的核心思想:

  • 把所有需要覆盖的地区取集合
  • 从电台中取覆盖集合中地区最多的一个
  • 集合中去除已覆盖地区, 继续匹配

代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;public class 贪心算法 {// 集合, 存放广播台static HashMap<String, HashSet<String>> broadcasts = new HashMap<>();// 集合, 存放地区static HashSet<String> areas = new HashSet<String>();// 贪心算法public static ArrayList<String> Greedy() {// 创建数组存放结果ArrayList<String> selects = new ArrayList<>();// 循环直至地区都覆盖while (areas.size() != 0) {// 存放交集最大的广播台String maxKey = null;// 存放交集最大的值int maxKeySize = 0;// 遍历每个剩余电台for (String key : broadcasts.keySet()) {// 取出交集个数int currSize = getRetainSize(key);// 替换当前最大if (currSize > 0 && currSize > maxKeySize) {maxKey = key;maxKeySize = currSize;}}// 添加广播台到结果selects.add(maxKey);// 移除广播台areas.removeAll(broadcasts.get(maxKey));}return selects;}// 剩余数量public static int getRetainSize(String key) {// 如果为空返回0if (key == null) return 0;// 存放key对应的地区集合HashSet<String> tempSet = new HashSet<>();// 取key对应的地区tempSet.addAll(broadcasts.get(key));// 取交集tempSet.retainAll(areas);return tempSet.size();}public static void main(String[] args) {//        | K1 | 北京, 上海, 天津 |
//        | K2 | 北京, 广州, 深圳 |
//        | K3 | 上海, 杭州, 成都 |
//        | K4 | 上海, 天津 |
//        | K5 | 杭州, 大连 |// 创建广播台HashSet<String> K1 = new HashSet<>(Arrays.asList("北京", "上海", "天津"));HashSet<String> K2 = new HashSet<>(Arrays.asList("北京", "广州", "深圳"));HashSet<String> K3 = new HashSet<>(Arrays.asList("上海", "杭州", "成都"));HashSet<String> K4 = new HashSet<>(Arrays.asList("上海", "天津"));HashSet<String> K5 = new HashSet<>(Arrays.asList("杭州", "大连"));// 加入mapbroadcasts.put("K1", K1);broadcasts.put("K2", K2);broadcasts.put("K3", K3);broadcasts.put("K4", K4);broadcasts.put("K5", K5);areas.addAll(K1);areas.addAll(K2);areas.addAll(K3);areas.addAll(K4);areas.addAll(K5);// 调试输出System.out.println(broadcasts);System.out.println(areas);ArrayList<String> result = Greedy();System.out.println(result);}
}

【Java 数据结构 算法】宁可累死自己, 也要卷死别人 18 贪心算法相关推荐

  1. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 12 红黑树

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 12⚠️ 红黑树 概述 红黑树 红黑树的实现 Node 类 添加元素 左旋 右旋 完整代码 概述 从今天开始, 小白我将带大家 ...

  2. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 6 循环队列

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 6⚠️ 循环队列 概述 循环队列 循环队列实现 改变队列大小 enqueue 方法 dequeue 方法 main 完整代码 ...

  3. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 8 环形链表

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 8⚠️ 环形链表 概述 链表 环形链表 环形链表实现 Node 类 insert 方法 remove 方法 main 完整代码 ...

  4. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 3 数组

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 3⚠️ 数组 概述 数组 声明数组的两个方法 创建数组的两个方法 索引 自定义数组 泛型 构造函数 元素操作 调用 完整代码 ...

  5. 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)

    14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...

  6. 总结 贪心算法_用经典例题轻松帮你搞定贪心算法

    转自:奶糖猫 贪心算法概念叙述 运用贪心算法求解问题时,会将问题分为若干个子问题,可以将其想象成俄罗斯套娃,利用贪心的原则从内向外依次求出当前子问题的最优解,也就是该算法不会直接从整体考虑问题,而是想 ...

  7. 不要累死自己,也不要卷死别人。

    最近从<哈佛商业周刊>里看到一篇关于应对企业内卷的文章,讲的是企业没有创新力,所以才会内卷.由此我想到个人内卷其实也是如此. 什么是内卷? 内卷指的是,在一个竞争激励的环境里,个体为了增加 ...

  8. java贪心,java实现贪心算法

    并证明了贪心算法解决此问题的有效性,且进行了实例验证,并进 行了复杂度分析,此算法是解决资源组合规划问题较好的方法. 关键词:贪心算法;java 程序;复杂度分析;...... 数据结构与算法 实验名 ...

  9. 算法基础(Java)--贪心算法

    前言 前面简单的介绍了八大经典排序算法,此文将要介绍贪心算法,并介绍一些常见贪心算法题目. 1. 贪心算法的概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最 ...

最新文章

  1. python字母大小写排序_Python中sorted()排序与字母大小写的问题
  2. 前端 Offer 提速:如何写出有亮点的简历
  3. 斐讯k1潘多拉专版固件_斐讯K1刷专版潘多拉固件以及教程(使用感受)
  4. [New Portal]Windows Azure Web Site (4) Web Site Gallery
  5. python turtle画圣诞树动图_圣诞节!教你用Python画棵圣诞树
  6. 鬼子进村(洛谷 1503)
  7. python寻峰算法_现代法谱估计(1)Yule Walker 方程法MATLAB及Python实现
  8. 【深入理解JVM】:Java对象的创建、内存布局、访问定位
  9. AS 中强制类型转换
  10. 意外把移动硬盘标记为活动分区怎么办?
  11. 学计算机专业必须马上买笔记本吗,大学生刚刚进入学校,需要购买笔记本电脑吗?听听学姐的建议吧...
  12. 联想y9000x做java_联想Y9000X装win7系统及BIOS设置教程(支持9代)
  13. 7月第3周回顾:裁员潮袭卷IT人 雅虎服“软”愿被收购
  14. 利用pypdf2 安装包 基于 python 制作的PDF 文档合并脚本
  15. 【OSATE学习笔记】AADL 样例 ARP4761 介绍
  16. linux怎么滑动命令行窗口_如何在Linux命令行界面愉快进行性能测试
  17. 不得不知道的搜索引擎使用技巧(思维导图版)
  18. jdk8stream+mybatis动态sql代替mybatis foreach in 查询
  19. springboot毕设项目创新创业管理系统1f90r(java+VUE+Mybatis+Maven+Mysql)
  20. Javascript中的恒等运算符与等于运算符的区别

热门文章

  1. url短网址 java_url.cn短网址生成api接口(腾讯短链接url生成)
  2. 公共钥匙盒 Java算法
  3. 简单聊一聊 Android App Bundle 的话题
  4. Excel插件获取单元格批注以及设置批注
  5. 英国脱欧给云计算行业带来震动:六大典型场景解析
  6. 【案例】携手捷普 :让流程立于云端,臻于至善
  7. 数据结构与算法是什么?
  8. 文件包含之本地包含的利用
  9. 【LNK2019】 无法解析的外部符号 __iob
  10. 无法解析的外部符号__imp__fprintf和 __imp____iob_func,SDL2