算法之05贪心算法

这段代码使用贪心算法解决了一个电台覆盖问题。通过创建一个HashMap表示不同电台覆盖的城市,然后逐步选择能覆盖最多未覆盖城市的电台,最终得到一个最小的电台组合,覆盖了所有城市。主要涉及数据结构和贪心策略。
摘要由CSDN通过智能技术生成

一、理解
在这里插入图片描述
二、代码

package com.ws.常用算法.贪心算法05;

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

public class tanXin {
    public static void main(String[] args) {
        //创建总数组(电台)
        HashMap<String, HashSet<String>> sum=new HashMap<>();
        //将各个电台放入
        HashSet<String> hashSet1=new HashSet<>();
        hashSet1.add("北京");
        hashSet1.add("上海");
        hashSet1.add("天津");

        HashSet<String> hashSet2=new HashSet<>();
        hashSet2.add("广州");
        hashSet2.add("北京");
        hashSet2.add("深圳");

        HashSet<String> hashSet3=new HashSet<>();
        hashSet3.add("成都");
        hashSet3.add("上海");
        hashSet3.add("杭州");

        HashSet<String> hashSet4=new HashSet<>();
        hashSet4.add("上海");
        hashSet4.add("天津");

        HashSet<String> hashSet5=new HashSet<>();
        hashSet5.add("杭州");
        hashSet5.add("大连");

        //加入到map
        sum.put("k1",hashSet1);
        sum.put("k2",hashSet2);
        sum.put("k3",hashSet3);
        sum.put("k4",hashSet4);
        sum.put("k5",hashSet5);

        HashSet<String> all=new HashSet();
        all.add("北京");
        all.add("上海");
        all.add("天津");
        all.add("广州");
        all.add("深圳");
        all.add("成都");
        all.add("杭州");
        all.add("大连");

        //创建存放选择的集合 选择顺序
        ArrayList<String> select = new ArrayList<>();

        //存放交集  用于删除all中一样的
        HashSet<String> temp=new HashSet<>();

        //指向
        String maxsize=null;
        //存放交集的长度
        while (all.size()!=0){
            //每次清空指向
            maxsize=null;
            //遍历k1-k5
            for (String k:sum.keySet()){
                //清空交集
                temp.clear();
                //指针遍历,key覆盖区域,那个变色的指针
                HashSet<String> ks=sum.get(k);//存放那一行
                temp.addAll(ks);//交集数组转存
                //求交集
                temp.retainAll(all);//交集存档到temp
                //当前集合包含未覆盖区域的数量比maxsize 重置  每次选最优的
                if(temp.size()>0&&(maxsize==null||temp.size()>sum.get(maxsize).size())){
                    maxsize=k;
                }
            }

            if (maxsize!=null){
                //加入到顺序集合
                select.add(maxsize);
                //清除指向地区
                all.removeAll(sum.get(maxsize));
            }
        }

        System.out.println("得到的结果是:"+select);
    }
}
得到的结果是:[k1, k2, k3, k5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值