贪心算法解决广播覆盖问题

介绍一个方法retainAll

 100,200就不包含了。

package suanfa;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;

//贪心算法解决广播地区覆盖
public class Tanxin {

	public static void main(String[] args) {
		//创建广播电台放入到map
		HashMap<String,HashSet<String>> broadcasts = new HashMap<String,HashSet<String>>();
		//将各个电台放入到broadcasts
		HashSet<String> hashSet1 = new HashSet<String>();
		hashSet1.add("北京");
		hashSet1.add("上海");
		hashSet1.add("天津");
		HashSet<String> hashSet2 = new HashSet<String>();
		hashSet2.add("广州");
		hashSet2.add("北京");
		hashSet2.add("深圳");
		HashSet<String> hashSet3 = new HashSet<String>();
		hashSet3.add("成都");
		hashSet3.add("上海");
		hashSet3.add("杭州");
		HashSet<String> hashSet4 = new HashSet<String>();
		hashSet4.add("上海");
		hashSet4.add("天津");
		HashSet<String> hashSet5 = new HashSet<String>();
		hashSet5.add("杭州");
		hashSet5.add("大连");
		//加入到map
		broadcasts.put("k1",hashSet1);
		broadcasts.put("k2",hashSet2);
		broadcasts.put("k3",hashSet3);
		broadcasts.put("k4",hashSet4);
		broadcasts.put("k5",hashSet5);
		//allAreas  存放所有地区
		HashSet<String> allAreas = new HashSet<String>();
		allAreas.add("北京");
		allAreas.add("上海");
		allAreas.add("天津");
		allAreas.add("广州");
		allAreas.add("深圳");
		allAreas.add("成都");
		allAreas.add("杭州");
		allAreas.add("大连");
		
		//创建ArrayList ,存放选择的电台集合
		ArrayList<String> selects = new ArrayList<String>();
		//定义一个临时集合,存放遍历过程中的电台覆盖的地区和当前areasAll里还没有覆盖的地区的交集
		HashSet<String> temp = new HashSet<String>();
		//定义maxKey,保存在一次遍历过程中,能够覆盖最大未覆盖的地区对应的key
		//如果maxKey 不为null,则加入到selects
		String maxKey = null;
		while(allAreas.size() != 0) {
			//每次遍历maxKey先重置
			maxKey = null;
			//遍历broadcasts,取出对应key
			for(String key : broadcasts.keySet()) {
				//每次for,重置temp
				temp.clear();
				//当前这个key能够覆盖的地区
				HashSet<String> areas = broadcasts.get(key);
				temp.addAll(areas);
				//求出temp和allAreas 集合的交集,交集赋给temp
				temp.retainAll(allAreas);
				if(temp.size() > 0 && (maxKey == null || temp.size() > broadcasts.get(maxKey).size())) {
					maxKey = key;
				}
			}
			//maxKey != null,加入selects
			if(maxKey != null) {
				selects.add(maxKey);
				//将maxKey指向的广播电台覆盖地区从allAreas去掉
				allAreas.removeAll(broadcasts.get(maxKey));
			}
		}
		System.out.println("选择的广播电台有"+selects);//[k1, k2, k3, k5]
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值