LeetCode笔记——1042.不邻接植花

题目

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

思路

1.暴力遍历所有花园的路径,顺序选择花直到出现可选的花。
2.利用哈希表存储花园的路径,顺序遍历n个花园,选择相邻花园已种的下一种花。

C#源码

方法一

public class Solution {
    public int[] GardenNoAdj(int n, int[][] paths) {
        int[] arrAns = new int[n];
        int floweTypes = 4;
        //遍历花园
        for (int i = 0; i < n; i++) 
        {
            //尝试选择
            for (int j = 1; j <= floweTypes; j++) 
            {
                if (IsTryChoose(i, j, arrAns, paths)) 
                {
                    arrAns[i] = j; // 选择成功
                    break;
                }
            }
        }
        return arrAns;
    }

    bool IsTryChoose(int garden, int type, int[] arrAns, int[][] paths)
    {
        foreach (int[] path in paths) 
        {
            int now = path[0] - 1, next = path[1] - 1;
            //判断相邻花园是否已选该花,已选则返回false
            if (now == garden && arrAns[next] == type)
                return false;
            if (next == garden && arrAns[now] == type) 
                return false;
        }
        return true;
    }
}

方法二

public class Solution {
    public int[] GardenNoAdj(int n, int[][] paths) {
        Dictionary<int, List<int>> dicGardens = new Dictionary<int, List<int>>();
        for(int i = 0; i < n; i++)
        {
            dicGardens[i] = new List<int>(); //创建每个花园记录路径列表,key:花园,value:路径
        }
        foreach(int[] path in paths)
        {
            //记录路径
            int start = path[0] - 1, end = path[1] - 1;
            if(start < end)
                dicGardens[end].Add(start);
            else
                dicGardens[start].Add(end);
        }

        //遍历相邻花园计算可选的花
        int[] arrAns = new int[n];
        foreach (var item in dicGardens) 
        {
            int garden = item.Key;
            List<int> listGardenPath = item.Value;
            bool[] arrIsTypeUsed = new bool[5]; //1-4代表不同种花
            foreach(int currentGarden in listGardenPath)
            {
                int tempType = arrAns[currentGarden];  //记录已选的花
                arrIsTypeUsed[tempType] = true;
            }
            int chooseType = 1;
            
            //判断相邻花园是否已选该花,已选则选择下一种花,避免相邻花园同样花
            while(arrIsTypeUsed[chooseType])
            {
                chooseType++;
            }
            arrAns[garden] = chooseType;
        }
        return arrAns;
    }
}

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

相关推荐

  1. LeetCode笔记——1042.邻接

    2024-04-09 09:40:03       37 阅读
  2. LeetCode 1045, 14, 25

    2024-04-09 09:40:03       34 阅读
  3. LeetCode1002. Find Common Characters

    2024-04-09 09:40:03       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 09:40:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 09:40:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 09:40:03       87 阅读
  4. Python语言-面向对象

    2024-04-09 09:40:03       96 阅读

热门阅读

  1. matlab 直方图及分布拟合

    2024-04-09 09:40:03       34 阅读
  2. NLP数据清洗:文本预处理

    2024-04-09 09:40:03       34 阅读
  3. 11. TypeScript 函数类型

    2024-04-09 09:40:03       36 阅读
  4. 安全运营中心(SOC)的核心功能

    2024-04-09 09:40:03       32 阅读
  5. Ubuntu 系统上设置 OpenVPN 客户端开机自动启动

    2024-04-09 09:40:03       38 阅读
  6. RISC-V 指令学习

    2024-04-09 09:40:03       32 阅读
  7. WPF Pack

    2024-04-09 09:40:03       30 阅读
  8. xcode 打开一个项目一直在loading解决方案

    2024-04-09 09:40:03       35 阅读
  9. 学习Python第十七天:用python构建一个SSH僵尸网络

    2024-04-09 09:40:03       32 阅读
  10. 【Rust】——编写自动化测试

    2024-04-09 09:40:03       41 阅读