Flower Planting With No Adjacent

medium graph coloring greedy adjacency list

Problem

You have n gardens labelled 1..n and bidirectional paths joining some of them; every garden has at most 3 paths. You have 4 flower types (1..4). Plant one flower type per garden so that no two gardens joined by a path share the same type. Return any valid assignment as an array answer where answer[i] is the type planted in garden i+1.

Inputn = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3]]
Output[1, 2, 3, 4]
Garden 1 = 1, garden 2 = 2, garden 3 = 3, garden 4 = 4; no edge connects equal types.

def gardenNoAdj(n, paths):
    adj = [[] for _ in range(n)]
    for a, b in paths:
        adj[a - 1].append(b - 1)
        adj[b - 1].append(a - 1)
    answer = [0] * n
    for g in range(n):
        used = {answer[h] for h in adj[g]}
        for c in (1, 2, 3, 4):
            if c not in used:
                answer[g] = c
                break
    return answer
function gardenNoAdj(n, paths) {
  const adj = Array.from({ length: n }, () => []);
  for (const [a, b] of paths) {
    adj[a - 1].push(b - 1);
    adj[b - 1].push(a - 1);
  }
  const answer = new Array(n).fill(0);
  for (let g = 0; g < n; g++) {
    const used = new Set(adj[g].map(h => answer[h]));
    for (let c = 1; c <= 4; c++) {
      if (!used.has(c)) { answer[g] = c; break; }
    }
  }
  return answer;
}
class Solution {
    public int[] gardenNoAdj(int n, int[][] paths) {
        List<List<Integer>> adj = new ArrayList<>();
        for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
        for (int[] p : paths) {
            adj.get(p[0] - 1).add(p[1] - 1);
            adj.get(p[1] - 1).add(p[0] - 1);
        }
        int[] answer = new int[n];
        for (int g = 0; g < n; g++) {
            boolean[] used = new boolean[5];
            for (int h : adj.get(g)) used[answer[h]] = true;
            for (int c = 1; c <= 4; c++) {
                if (!used[c]) { answer[g] = c; break; }
            }
        }
        return answer;
    }
}
vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
    vector<vector<int>> adj(n);
    for (auto& p : paths) {
        adj[p[0] - 1].push_back(p[1] - 1);
        adj[p[1] - 1].push_back(p[0] - 1);
    }
    vector<int> answer(n, 0);
    for (int g = 0; g < n; g++) {
        bool used[5] = {false};
        for (int h : adj[g]) used[answer[h]] = true;
        for (int c = 1; c <= 4; c++) {
            if (!used[c]) { answer[g] = c; break; }
        }
    }
    return answer;
}
Time: O(n + e) Space: O(n + e)