package com.guigu.algorithm.greedy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
/**
*@author: guorui fu
*@versiion: 1.0
* 贪心算法
*/
public class GreedyAlgorithm {
public static void main(String[] args) {
//创建广播电台放入HashMap中
HashMap<String, HashSet<String>> broadcast = new HashMap<>();
HashSet<String> hashSet1 = new HashSet<>();
hashSet1.add("北京");
hashSet1.add("上海");
hashSet1.add("天津");
broadcast.put("k1",hashSet1);
HashSet<String> hashSet2 = new HashSet<>();
hashSet2.add("广州");
hashSet2.add("北京");
hashSet2.add("深圳");
broadcast.put("k2",hashSet2);
HashSet<String> hashSet3 = new HashSet<>();
hashSet3.add("成都");
hashSet3.add("上海");
hashSet3.add("杭州");
broadcast.put("k3",hashSet3);
HashSet<String> hashSet4 = new HashSet<>();
hashSet4.addAll(Arrays.asList("上海","天津"));
broadcast.put("k4",hashSet4);
HashSet<String> hashSet5 = new HashSet<>();
hashSet5.addAll(Arrays.asList("杭州","大连"));
broadcast.put("k5",hashSet5);
//存放所有地区 HashSet可以自动去重
HashSet<String> retainAreas = new HashSet<>();
for (HashSet<String> value : broadcast.values()) {
retainAreas.addAll(value);
}
//创建一个ArrayList 存放选择的电台集合
ArrayList<String> selects = new ArrayList<>();
//定义一个临时的集合,在遍历的过程中 存放遍历过程中的电台覆盖地区和当前还没有覆盖地区的交集
HashSet<String> tempSet = new HashSet<>();
//保存一次遍历中 k1等最大未被覆盖个数
String maxKey = null;
int maxLen = 0;//交集最大个数
//开始贪心算法
while (retainAreas.size() != 0){
//每进行一次就要置null和为0
maxKey = null;
maxLen = 0;
for (String key : broadcast.keySet()) {
//每进行一次for循环 要对交集tempSet进行置null
tempSet.clear();
HashSet<String> areas = broadcast.get(key);
tempSet.addAll(areas);
//求出tempSet和retainAreas的交集,交集会赋给tempSet
tempSet.retainAll(retainAreas);
//第一次以及交集不为0 或者交集不为0并且交集大于上一个最大个数
if (tempSet.size() > 0 && (maxKey == null || tempSet.size() > maxLen)){
maxKey = key;
maxLen = tempSet.size();
}
}
//如果maxKey不等于null 就将maxKey加入电台集合
if (maxKey != null){
selects.add(maxKey);
//从retainAreas中去除已加入电台对应的城市
retainAreas.removeAll(broadcast.get(maxKey));
}
}
System.out.println("得到的结果是=" + selects.toString());
}
}
[算法] 贪心算法 解决广播覆盖问题
最新推荐文章于 2024-10-03 13:36:06 发布
该代码示例展示了一个使用Java编写的贪心算法,目的是通过选择最少的广播电台来覆盖最多的地区。程序首先创建一个HashMap存储广播电台及其覆盖的城市,然后通过贪心策略选择能覆盖最多未覆盖城市的电台,并从剩余城市中移除已被覆盖的城市,直到所有城市都被覆盖。
摘要由CSDN通过智能技术生成