【每日一题Day178】LC1042不邻接植花 | 位运算 + 枚举

简介: 【每日一题Day178】LC1042不邻接植花 | 位运算 + 枚举

不邻接植花【LC1042】

n 个花园,按从 1n 标记。另有数组 paths ,其中 paths[i] = [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。

另外,所有花园 最多3 条路径可以进入或离开.

你需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。

以数组形式返回 任一 可行的方案作为答案 answer,其中 answer[i] 为在第 (i+1) 个花园中种植的花的种类。花的种类用 1、2、3、4 表示。保证存在答案。

没有周末的周末

  • 思路
    先构造邻接矩阵,然后枚举每一个节点,找到和它相邻的节点能够用的花园的最小值。

使用状态压缩mask记录每种花的使用情况,第i为1时表示第i ii种花已经使用。


小技巧:花园的值为mask从低到高第一个0的位置,即计算mask取反后尾零个数

Integer.numberOfTrailingZeros(~mask);

实现

class Solution {
    public int[] gardenNoAdj(int n, int[][] paths) {
        List<Integer>[] g = new List[n];
        int[] res = new int[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int[] path : paths){
            int u = path[0] - 1, v = path[1] - 1;
            g[u].add(v);
            g[v].add(u);
        }
        for (int i = 0; i < n; i++){
            int mask = 0;// 记录相连的花的使用情况
            for (int j : g[i]){              
                 mask |= (1 << res[j]);             
            }
            res[i] = Integer.numberOfTrailingZeros(~mask);
            /*for (int k = 1; k <= 4; k++){
                if (((mask >> k) & 1) == 0){
                    res[i] = k;
                    break;
                }
            }*/
        }
        return res;
    }
}

image.png

目录
相关文章
|
7月前
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
57 0
【每日一题Day127】LC1238循环码排列 | 格雷码构造 位运算
|
7月前
|
存储
【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈
【每日一题Day254】LC445两数相加Ⅱ | 链表反转 栈
52 0
|
7月前
|
存储
【每日一题Day253】LC2两数相加 | 链表模拟
【每日一题Day253】LC2两数相加 | 链表模拟
30 0
|
7月前
【每日一题Day155】LC1630等差子数组 | 枚举+排序
【每日一题Day155】LC1630等差子数组 | 枚举+排序
47 0
|
7月前
|
索引
【每日一题Day131】LC1144递减元素使数组呈锯齿状 | 贪心+枚举
【每日一题Day131】LC1144递减元素使数组呈锯齿状 | 贪心+枚举
52 0
|
7月前
【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论
【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论
56 0
|
7月前
【每日一题Day194】LC970强整数 | 枚举
【每日一题Day194】LC970强整数 | 枚举
39 0
|
7月前
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
【每日一题Day204】LC1330翻转子数组得到最大的数组值 | 数学
50 1
|
7月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
34 0
|
7月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
40 0