1. 程式人生 > 實用技巧 >1042. 不鄰接植花-無向圖-簡單

1042. 不鄰接植花-無向圖-簡單

問題描述

有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]

提示:

1 <= N <= 10000
0 <= paths.size <= 20000
不存在花園有 4 條或者更多路徑可以進入或離開。
保證存在答案。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/flower-planting-with-no-adjacent

解答

class Solution {
    Map<Integer,List<Integer>> graph;
    Map
<Integer,Integer> flower; public int[] gardenNoAdj(int N, int[][] paths) { graph = new HashMap<Integer,List<Integer>>(); flower = new HashMap<Integer,Integer>(); List<Integer> available = new LinkedList<Integer>(); available.add(
1); available.add(2); available.add(3); available.add(4); int i; for(i=1;i<=N;i++){ graph.put(i,new ArrayList<Integer>()); flower.put(i,0); } //構造graph for(int[] temp:paths){ graph.get(temp[0]).add(temp[1]); graph.get(temp[1]).add(temp[0]); } for(int p:graph.keySet()){ if(flower.get(p)==0){ List<Integer> temp = new LinkedList<Integer>(available); for(int j:graph.get(p)){//移除可用的花 if(flower.get(j)!=0)temp.remove(new Integer(flower.get(j))); } flower.put(p,temp.get(0)); } } int[] res = new int[N]; i = 0; for(int p:flower.values()){ res[i] = p; i++; } return res; } }