返回介绍

solution / 1000-1099 / 1042.Flower Planting With No Adjacent / README

发布于 2024-06-17 01:03:31 字数 5070 浏览 0 评论 0 收藏 0

1042. 不邻接植花

English Version

题目描述

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

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

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

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

 

示例 1:

输入:n = 3, paths = [[1,2],[2,3],[3,1]]
输出:[1,2,3]
解释:
花园 1 和 2 花的种类不同。
花园 2 和 3 花的种类不同。
花园 3 和 1 花的种类不同。
因此,[1,2,3] 是一个满足题意的答案。其他满足题意的答案有 [1,2,4]、[1,4,2] 和 [3,2,1]

示例 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 <= 104
  • 0 <= paths.length <= 2 * 104
  • paths[i].length == 2
  • 1 <= xi, yi <= n
  • xi != yi
  • 每个花园 最多3 条路径可以进入或离开

解法

方法一:枚举

我们先根据数组 $paths$ 构建图 $g$,其中 $g[x]$ 表示与花园 $x$ 相邻的花园列表。

接下来,对于每个花园 $x$,我们先找出与 $x$ 相邻的花园 $y$,并将 $y$ 花园中种植的花的种类标记为已使用。然后我们从花的种类 $1$ 开始枚举,直到找到一个未被使用的花的种类 $c$,将 $c$ 标记为 $x$ 花园中种植的花的种类,然后继续枚举下一个花园。

枚举结束后,返回答案即可。

时间复杂度 $O(n + m)$,空间复杂度 $O(n + m)$。其中 $n$ 和 $m$ 分别是花园的数量和路径的数量。

class Solution:
  def gardenNoAdj(self, n: int, paths: List[List[int]]) -> List[int]:
    g = defaultdict(list)
    for x, y in paths:
      x, y = x - 1, y - 1
      g[x].append(y)
      g[y].append(x)
    ans = [0] * n
    for x in range(n):
      used = {ans[y] for y in g[x]}
      for c in range(1, 5):
        if c not in used:
          ans[x] = c
          break
    return ans
class Solution {
  public int[] gardenNoAdj(int n, int[][] paths) {
    List<Integer>[] g = new List[n];
    Arrays.setAll(g, k -> new ArrayList<>());
    for (var p : paths) {
      int x = p[0] - 1, y = p[1] - 1;
      g[x].add(y);
      g[y].add(x);
    }
    int[] ans = new int[n];
    boolean[] used = new boolean[5];
    for (int x = 0; x < n; ++x) {
      Arrays.fill(used, false);
      for (int y : g[x]) {
        used[ans[y]] = true;
      }
      for (int c = 1; c < 5; ++c) {
        if (!used[c]) {
          ans[x] = c;
          break;
        }
      }
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
    vector<vector<int>> g(n);
    for (auto& p : paths) {
      int x = p[0] - 1, y = p[1] - 1;
      g[x].push_back(y);
      g[y].push_back(x);
    }
    vector<int> ans(n);
    bool used[5];
    for (int x = 0; x < n; ++x) {
      memset(used, false, sizeof(used));
      for (int y : g[x]) {
        used[ans[y]] = true;
      }
      for (int c = 1; c < 5; ++c) {
        if (!used[c]) {
          ans[x] = c;
          break;
        }
      }
    }
    return ans;
  }
};
func gardenNoAdj(n int, paths [][]int) []int {
  g := make([][]int, n)
  for _, p := range paths {
    x, y := p[0]-1, p[1]-1
    g[x] = append(g[x], y)
    g[y] = append(g[y], x)
  }
  ans := make([]int, n)
  for x := 0; x < n; x++ {
    used := [5]bool{}
    for _, y := range g[x] {
      used[ans[y]] = true
    }
    for c := 1; c < 5; c++ {
      if !used[c] {
        ans[x] = c
        break
      }
    }
  }
  return ans
}
function gardenNoAdj(n: number, paths: number[][]): number[] {
  const g: number[][] = new Array(n).fill(0).map(() => []);
  for (const [x, y] of paths) {
    g[x - 1].push(y - 1);
    g[y - 1].push(x - 1);
  }
  const ans: number[] = new Array(n).fill(0);
  for (let x = 0; x < n; ++x) {
    const used: boolean[] = new Array(5).fill(false);
    for (const y of g[x]) {
      used[ans[y]] = true;
    }
    for (let c = 1; c < 5; ++c) {
      if (!used[c]) {
        ans[x] = c;
        break;
      }
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文