首页 > 编程语言 >贪心算法——数据结构与算法学习

贪心算法——数据结构与算法学习

时间:2022-11-21 20:47:14浏览次数:38  
标签:allAreas HashSet add 算法 broadcasts new 数据结构 tempSet 贪心

贪心算法

基本思想:就是程序在进行运算时,保证每一步达到最优值。不要求总体最优,而是要求每一步都是最优。

区间问题

给定多个区间,计算让这些区间互不重叠所需要移除区间的最小个数。

INPUT:[[1,2],[2,4],[1,3]]
OUTPUT:1

这里贪心算法的体现:就是优先保留结尾小且不相交的区间。

代码说明:

static void solution(int[][] intvls){
    Arrays,sort(intvls,new Comparator<int[]>(){
        public int compare(int[] o1,int[] o2){
            return o1[1] - o2[1];
        }
    })
        int count = 0;
    	int pre = intvls[0][1];
    	for(int i = 1;i < intvls.length;i++){
            if(intvls[i][0] >= pre){
                count++;
                pre = intvls[i][1];
            }
        }
    return intvls.length - count;
}

广播台覆盖

假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号?

思路说明:

核心思想:遍历所有的广播电台,找到一个覆盖了最多未覆盖地区的电台

核心代码

 for (String key : broadcasts.keySet()) {//进行了一次遍历
                //判断如何选择电台
                tempSet.clear();
                HashSet<String> strings = broadcasts.get(key);
                tempSet.addAll(strings);
                tempSet.retainAll(allAreas);
                if(tempSet.size() > 0 &&
                        (maxKey == null || tempSet.size() > retain)){
                    maxKey = key;
                    retain = tempSet.size();
                }
            }

完整代码:

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<>();
        //定义一个临时的集合
        HashSet<String> tempSet = new HashSet<>();
        //定义给 maxKey , 保存在一次遍历过程中,能够覆盖最大未覆盖的地区对应的电台的 key
        String maxKey = null;
        //记录每次最大可再覆盖的电台数
        int retain = 0;
        while(allAreas.size() != 0){
            maxKey = null;
            for (String key : broadcasts.keySet()) {//进行了一次遍历
                //判断如何选择电台
                tempSet.clear();
                HashSet<String> strings = broadcasts.get(key);
                tempSet.addAll(strings);
                tempSet.retainAll(allAreas);
                if(tempSet.size() > 0 &&
                        (maxKey == null || tempSet.size() > retain)){
                    maxKey = key;
                    retain = tempSet.size();
                }
            }
            if (maxKey != null){
                selects.add(maxKey);
                allAreas.removeAll(broadcasts.get(maxKey));//从列表中移除本次广播的地址
            }
        }

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

}

标签:allAreas,HashSet,add,算法,broadcasts,new,数据结构,tempSet,贪心
From: https://www.cnblogs.com/robyn2022/p/16913123.html

相关文章