前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode - 不邻接植花

LeetCode - 不邻接植花

作者头像
晓痴
发布2019-07-24 11:56:16
4630
发布2019-07-24 11:56:16
举报
文章被收录于专栏:曌的晓痴曌的晓痴

这题是LeetCode第136?次周赛的题目,难度是Easy,本来可以靠这题答对挺近周赛前100名,结果我看了眼题目后,就出去吃饭了。于是就在饭桌上思考怎么解题,最后在结束前把代码写了出来,但是由于有些BUG,所以在改BUG的时候周赛就结束了....这可能是我最靠近前100的一次。

原题地址: https://leetcode-cn.com/problems/flower-planting-with-no-adjacent/

题目描述

有 N 个花园,按从 1 到 N 标记。在每个花园中,你打算种下四种花之一。

paths[i] = [x, y] 描述了花园 x 到花园 y 的双向路径。

另外,没有花园有 3 条以上的路径可以进入或者离开。

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

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

示例 1:

输入:N = 3, paths = [[1,2],[2,3],[3,1]]

输出:[1,2,3]

示例 2:

输入:N = 4, paths = [[1,2],[3,4]]

输出:[1,2,1,2]

示例 3:

输入:N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]

输出:[1,2,3,4]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/flower-planting-with-no-adjacent

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

这题其实并不是很难,我的思路是这样的:

  1. 先新建每个花园之间的连接图
  2. 遍历每个花园,查看和它邻接的花园种的花,采用位运算的概念,邻接花园种植哪种颜色的花,就将结果第几位设置为1。
    1. 比如花园A邻接的花园B、C分别种植了1和4,那么结果就是1001,第二位是0,那么就可以种第二种花。
  3. 根据计算结果,可以很快的知道这个花园该种什么花。

中文官网题解:

https://leetcode-cn.com/problems/flower-planting-with-no-adjacent/solution/

个人题解:

代码语言:javascript
复制
class Solution {
     public int[] gardenNoAdj(int N, int[][] paths) {
        Map<Integer, Garden> map = new HashMap<>(N);
        for (int[] path : paths) {
            Garden garden = map.get(path[0]);
            if (garden == null) {
                garden = new Garden(path[0]);
                map.put(path[0], garden);
            }
            garden.paths.add(path[1]);

            Garden target = map.get(path[1]);
            if (target == null) {
                target = new Garden(path[1]);
                map.put(path[1], target);
            }
            target.paths.add(path[0]);
        }
        int[] result = new int[N];
        for (int i = 0; i < N; i++) {
            Garden garden = map.get(i+1);
            if (garden == null) {
                result[i] = 1;
            }else if (garden.paths.isEmpty()) {
                result[i] = 1;
            } else {
                byte b = 0;
                for (int g : garden.paths) {
                    if (result[g-1] == 1) {
                        b |= 1;
                    } else if (result[g-1] == 2) {
                        b |= 2;
                    } else if (result[g-1] == 3) {
                        b |= 4;
                    } else if (result[g-1] == 4) {
                        b |= 8;
                    }
                }
               if (b == 0) {
                    result[i] = 1;
                } else if (b == 1) {
                    result[i] = 2;
                } else if (b == 2) {
                    result[i] = 1;
                } else if (b == 3) {
                    result[i] = 3;
                } else if (b == 4) {
                    result[i] = 1;
                } else if (b == 5) {
                    result[i] = 2;
                } else if (b == 6) {
                    result[i] = 1;
                } else if (b == 7) {
                    result[i] = 4;
                } else if (b == 8) {
                    result[i] = 1;
                }
            }
        }
        return result;
    }

    class Garden {
        int number;
        Set<Integer> paths;

        public Garden(int number) {
            this.number = number;
            this.paths = new HashSet<>(3);
        }
    }

}

结果:

这个结果很符合个人的实力定位。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 曌的晓痴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档