LeetCode 1042. Flower Planting With No Adjacent【模拟,图,BFS,DFS】中等

news/2024/7/20 21:16:53 标签: leetcode, 深度优先, 宽度优先

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

You have n gardens, labeled from 1 to n, and an array paths where paths[i] = [xi, yi] describes a bidirectional path between garden xi to garden yi. In each garden, you want to plant one of 4 types of flowers.

All gardens have at most 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 1, 2, 3, or 4. It is guaranteed an answer exists.

Example 1:

Input: n = 3, paths = [[1,2],[2,3],[3,1]]
Output: [1,2,3]
Explanation:
Gardens 1 and 2 have different types.
Gardens 2 and 3 have different types.
Gardens 3 and 1 have different types.
Hence, [1,2,3] is a valid answer. Other valid answers include [1,2,4], [1,4,2], and [3,2,1].

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]

Constraints:

  • 1 <= n <= 10^4
  • 0 <= paths.length <= 2 * 10^4
  • paths[i].length == 2
  • 1 <= xi, yi <= n
  • xi != yi
  • Every garden has at most 3 paths coming into or leaving it.

题意:有 n 个花园,按从 1n 标记。另有数组 paths ,其中 paths[i] = [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。另外,所有花园 最多3 条路径可以进入或离开。需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。

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


解法 模拟+暴力

出题人可能是受到四色定理的启发出的题。问题相当于用 4 4 4 种颜色给图中的每个节点染色,要求相邻节点颜色不同。而「所有花园最多有 3 3 3 条路径可以进入或离开」,这相当于图中每个点的度数至多为 3 3 3 ,那么只要选一个和邻居不同的颜色即可

哈希表(数组)实现:

class Solution { 
public:
    vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
        vector<vector<int>> g(n);
        vector<int> ans(n);
        for (vector<int> &v : paths) {
            g[v[0] - 1].push_back(v[1] - 1); // 从0开始
            g[v[1] - 1].push_back(v[0] - 1);
        } 
        for (int i = 0; i < n; ++i) { // 给结点i选择颜色
            bool used[5]{};
            for (int j: g[i]) used[ans[j]] = true;
            while (used[++ans[i]]) ;
        }
        return ans;
    }
}; 

位运算实现: 我们需要找到 u s e d used used 从低到高第一个 0 0 0 的位置,即第一个未使用的颜色,这需要我们计算 u s e d used used 取反后的尾零个数。例如 used = 1011 1 ( 2 ) \textit{used}=10111_{(2)} used=10111(2) ​,取反后变为 100 0 ( 2 ) 1000_{(2)} 1000(2) (实际前导零也取反了,但不影响计算),尾零个数为 3 3 3 ,这恰好就是从低位到高位第一个 0 0 0 的位置。

class Solution { 
public:
    vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
        vector<vector<int>> g(n);
        vector<int> ans(n);
        for (vector<int> &v : paths) {
            g[v[0] - 1].push_back(v[1] - 1); // 从0开始
            g[v[1] - 1].push_back(v[0] - 1);
        } 
        for (int i = 0; i < n; ++i) { // 给结点i选择颜色
            int used = 1; // 由于颜色是1~4,把0加入mask保证下面不会算出0
            for (int j: g[i]) used |= 1 << ans[j];
            ans[i] = __builtin_ctz(~used);
        }
        return ans;
    }
}; 

复杂度分析:

  • 时间复杂度: O ( n + m ) O(n+m) O(n+m) ,其中 m m m p a t h s paths paths 的长度。
  • 空间复杂度: O ( n + m ) O(n+m) O(n+m)

http://www.niftyadmin.cn/n/229343.html

相关文章

OpenAI文档翻译——搭建第一个自己的ChatGPT应用

这篇主要是讲了重头到位创建一个基于OpenAI API的应用程序的过程&#xff0c;同时给出了Node.js、Python版本的实例代码。应用程序的构建总体来说是很简单的就是一个接口调用&#xff0c;前提是我们需要提供密匙。 如果想要获取更好的结果返回一个是可以给模型提供一些列子从而…

【iOS】—— 消息传递和消息转发

消息传递和消息转发 文章目录消息传递和消息转发消息传递&#xff08;方法调用&#xff09;IMP指针IMP与SEL的区别与联系SEL是通过表取对应关系的IMP&#xff0c;进行方法的调用快速查找imp过程汇编代码查找过程总结消息发送快速查找imp(汇编):方法缓存慢速查找总结慢速查找消息…

WebRTC 系列(三、点对点通话,H5、Android、iOS)

WebRTC 系列&#xff08;二、本地 demo&#xff0c;H5、Android、iOS&#xff09; 上一篇博客中&#xff0c;我已经展示了各端的本地 demo&#xff0c;大家应该知道 WebRTC 怎么用了。在本地 demo 中是用了一个 RemotePeerConnection 来模拟远端&#xff0c;可能理解起来还有点…

Linux基础(超级无敌认真好用,万字收藏篇!!!!)

文章目录Linux基础1 Linux概述1.1 Linux特点1.2 Linux和Window区别2 Linux安装2.1 什么是虚拟化2.2 安装虚拟机2.3 配置网络环境3 Linux文件目录4 Linux常用命令4.1 文件与目录操作4.2 查看文件内容4.3 文本内容处理4.4 查询操作4.5 网络相关4.6 其他命令4.7 解压缩命令5 VI/VI…

GAT的基础理论

文章目录GAT原理&#xff08;理解用&#xff09;GAT工作流程计算注意力系数&#xff08;attention coefficient&#xff09;加权求和&#xff08;aggregate&#xff09;GAT深入理解GAT的实用基础理论&#xff08;编代码用&#xff09;1. GAT的底层实现&#xff08;pytorch&…

信息是调动、指挥能量的要诀。【科技公司从本质上讲都是信息公司】

文章目录 引言I 信息是调动、指挥能量的要诀。1.1 文明的竞争1.2 信息的传播II 语言2.1 语言产生2.2 语言的作用III 数字和文字3.1 书写系统3.2 书写系统的作用引言 能量是衡量文明的标尺,也是解密文明的钥匙。信息是调动、指挥能量的要诀。语言、数字、文字、书写系统 I 信息…

CC2642的GGS使用笔记

一、前言 我们了解BLE的GATT之前需要了解一些基本的概念&#xff1a; &#xff08;1&#xff09;Profile,字面意思简介、概述、形象印象、轮廓、配置文件&#xff0c;在BLE中&#xff0c;我们可能把它理解成配置文件较好&#xff0c;Profile有一些是BLE SIG规定的&#xff0c;有…

【LeetCode】剑指 Offer 58. 反转字符串 p284 -- Java Version

1. 题目介绍&#xff08;58. 反转字符串&#xff09; 面试题58&#xff1a;翻转字符串&#xff0c; 一共分为两小题&#xff1a; 题目一&#xff1a;翻转单词顺序题目二&#xff1a;左旋转字符串 2. 题目1&#xff1a;翻转单词顺序 题目链接&#xff1a;https://leetcode.cn/p…