zoukankan      html  css  js  c++  java
  • LeetCode 1042. Flower Planting With No Adjacent

    原题链接在这里:https://leetcode.com/problems/flower-planting-with-no-adjacent/

    题目:

    You have N gardens, labelled 1 to N.  In each garden, you want to plant one of 4 types of flowers.

    paths[i] = [x, y] describes the existence of a bidirectional path from garden x to garden y.

    Also, there is no garden that has more than 3 paths coming into or leaving it.

    Your task is to choose a flower type for each garden such that, for any two gardens connected by a path, they have different types of flowers.

    Return any such a choice as an array answer, where answer[i] is the type of flower planted in the (i+1)-th garden.  The flower types are denoted 123, or 4.  It is guaranteed an answer exists.

    Example 1:

    Input: N = 3, paths = [[1,2],[2,3],[3,1]]
    Output: [1,2,3]
    

    Example 2:

    Input: N = 4, paths = [[1,2],[3,4]]
    Output: [1,2,1,2]
    

    Example 3:

    Input: N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
    Output: [1,2,3,4]

    Note:

    • 1 <= N <= 10000
    • 0 <= paths.size <= 20000
    • No garden has 4 or more paths coming into or leaving it.
    • It is guaranteed an answer exists.

    题解:

    Build the graph with edges. 

    For one node, we could check for all its neighbors, what colors have been used. Have a color array to record which color has been used among its neighbors.

    Then for this node color, it could choose one color that hasn't been used.

    Time Compleixty: O(e + N). e = paths.length.

    Space: O(e + N).

    AC Java:

     1 class Solution {
     2     public int[] gardenNoAdj(int N, int[][] paths) {
     3         Map<Integer, Set<Integer>> graph = new HashMap<>();
     4         for(int i = 0; i < N; i++){
     5             graph.put(i, new HashSet<Integer>());
     6         }
     7         
     8         for(int [] p : paths){
     9             int x = p[0] - 1;
    10             int y = p[1] - 1;
    11             graph.get(x).add(y);
    12             graph.get(y).add(x);
    13         }
    14         
    15         int [] res = new int[N];
    16         for(int i = 0; i < N; i++){
    17             int [] color = new int[5];
    18             for(int nei : graph.get(i)){
    19                 color[res[nei]] = 1;
    20             }
    21             
    22             for(int c = 4; c >= 1; c--){
    23                 if(color[c] != 1){
    24                     res[i] = c;
    25                 }
    26             }
    27         }
    28         
    29         return res;
    30     }
    31 }
  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12539050.html
Copyright © 2011-2022 走看看