1042. 不邻接植花 LeetCode

搞不懂这题怎么能算简单题…
这道题无论广度搜索还是深度搜索用处都不大…
以广度优先搜索为例:
如果同一层的节点直接包含路径 则很难被寻找到
因策这道题可以考虑时候用邻接表的方式进行存储
具体来时就是
Map<Integer, Vector> map = new HashMap<>();这个。
integer用来保存图的节点(无论是起点还是终点)
因为这个无论如何都可以进行染色,所以不妨先把1染成颜色1
之后每个图节点进行循环,确保每个节点之前的节点都已经被染色即可(例如第3个节点之前,确保1,2,已经被染色)
由于boolean[] used = new boolean[5];
循环中每次都刷新了used数组,所以在为当前节点染色之前,需要先把前i-1个节点的颜色获取到(就是sln[i-1])
之后把这些颜色的标志符置位true

import java.util.*;

/**
 * @Description 我们写代码,靠的是技术(狗头)
 * @auther admin
 * @create 2020-06-21 16:45
 */


class Solution1042 {
    public int[] gardenNoAdj(int N, int[][] paths) {
        Map<Integer, Vector<Integer>> map = new HashMap<>();
        /**
         * 可以假设有4个集合 用来表示这个集合里面的花坛将会用Integer这个颜色来染
         * 如果花坛之间两两有边,则表示他们不能放到同一个集合里面
         */
        for (int i = 1; i <= N; i++) {
            map.put(i, new Vector<>());
        }
        /**
         * 先默认将一号花坛加入集合1中
         */
        int[] sln = new int[N];
        if (N < 4) {
            for (int i = 0; i < N; i++) sln[i] = i + 1;
            return sln;
        }
        /**
         * 判断颜色1-4是否被使用过
         */

        for (int i = 0; i < paths.length; i++) {
            /**
             * 表示paths[j][0]和paths[j][1]中的起点或者终点包含i
             * 如果i为起点 则不能放到终点对应的那个集合
             * 反之也是
             *
             * 将path中的这些点加到刚刚的map中
             */
            map.get(paths[i][0]).add(paths[i][1]);
            map.get(paths[i][1]).add(paths[i][0]);
        }
        /**
         * 开始染色
         * 1已经染过了 为1
         * 所以从2开始染
         */
        sln[0] = 1;
        for(int i = 2; i <= N; i++) {
            boolean[] used = new boolean[5];
            for (int index:map.get(i)){
                if(index<i)used[sln[index-1]] = true;
            }
            for(int color = 1;color<=4;color++){
                if(!used[color]){
                    sln[i-1] = color;break;
                }
            }
        }
        return sln;
    }

    public static void main(String[] args) {
        Solution1042 solution1042 = new Solution1042();
       int[] a = solution1042.gardenNoAdj(5,new int[][]{{4,1},{4,2},{4,3},{2,5},{1,2},{1,5}});
       for(int i = 0;i<4;i++){
           System.out.println(a[i]);
       }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值