Day593&594.贪心算法 -数据结构和算法Java

Day593&594.贪心算法 -数据结构和算法Java,第1张

贪心算法 一、问题引出

二、介绍

三、思路分析




四、代码实现
package com.achang.algorithm;

import java.util.*;

/**
 * 贪心算法
 */
public class GreedyAlgorithm {
    public static void main(String[] args) {
        //创建广播电台
        HashMap<String, HashSet<String>> broadCasts = new HashMap<>();
        //初始化电台
        HashSet<String> k1Set = new HashSet<>();
        HashSet<String> k2Set = new HashSet<>();
        HashSet<String> k3Set = new HashSet<>();
        HashSet<String> k4Set = new HashSet<>();
        HashSet<String> k5Set = new HashSet<>();
        k1Set.add("北京");
        k1Set.add("上海");
        k1Set.add("天津");
        k2Set.add("广州");
        k2Set.add("北京");
        k2Set.add("深圳");
        k3Set.add("成都");
        k3Set.add("上海");
        k3Set.add("杭州");
        k4Set.add("上海");
        k4Set.add("天津");
        k5Set.add("杭州");
        k5Set.add("大连");
        broadCasts.put("k1",k1Set);
        broadCasts.put("k2",k2Set);
        broadCasts.put("k3",k3Set);
        broadCasts.put("k4",k4Set);
        broadCasts.put("k5",k5Set);

        //初始化所有地区集合
        HashSet<String> allSet = new HashSet<>();
        allSet.addAll(k1Set);
        allSet.addAll(k2Set);
        allSet.addAll(k3Set);
        allSet.addAll(k4Set);
        allSet.addAll(k5Set);
        System.out.println(allSet);

        //存放电台集合
        List<String> selectList = new ArrayList<>();
        //保存在遍历过程中,存放电台覆盖的地区和当前还没有覆盖地区的交集
        HashSet<String> tempSet = new HashSet<>();
        //maxKey,保存在一次遍历过程中,能够覆盖最多未覆盖的地区对应电台的key,如果maxKey,不为空,则就加入到selectList中
        String maxKey = null;
        while (allSet.size() != 0){
            //每进行一次while循环,就需要把maxKey置空
            maxKey = null;
            for (Map.Entry<String, HashSet<String>> stringHashSetEntry : broadCasts.entrySet()) {
                tempSet.clear();
                //当前key所覆盖地区
                HashSet<String> value = stringHashSetEntry.getValue();
                tempSet.addAll(value);
                //求出两个集合的交集,并重新赋值给tempSet;
                tempSet.retainAll(allSet);
                //如果当前这个集合包含的未覆盖地区数量,比maxKey指向的集合未覆盖的地区还多
                //就需要重置maxKey
                HashSet<String> maxKeyArea = broadCasts.get(maxKey);
                if(tempSet.size() > 0
                        && (maxKey == null || tempSet.size() >
                        maxKeyArea.size())){
                    maxKey = stringHashSetEntry.getKey();
                    maxKeyArea = broadCasts.get(maxKey);
                    maxKeyArea.retainAll(allSet);
                }
            }
            //maxKey != null 就应该被加入到selectList中
            if (maxKey != null){
                selectList.add(maxKey);
                //将maxKey所指向的广播电台覆盖的地区从allSet中去除
                allSet.removeAll(broadCasts.get(maxKey));
            }

        }
        System.out.println("得到的选择结果:"+selectList);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/721819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存