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

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day593&594.贪心算法 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

贪心算法

一、问题引出

二、介绍

三、思路分析




四、代码实现

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);
    


以上是关于Day593&594.贪心算法 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

算法学习day31贪心part01-45553376

P6767 [BalticOI 2020/2012 Day0] Roses(贪心&gcd)

常见算法——贪心算法&分治算法

Java版算法思想贪心算法&动态规划

Java版算法思想贪心算法&动态规划

leetcode刷题之贪心算法(C++&Java)