1042. Flower Planting With No Adjacent

 

仅供自己学习

 

思路:

因为只是要相邻的花园种的花不同,那么我们对每个花园都建立一个容器存入他的相邻花园,记录这些花园所用的颜色即可。

开始根据path建立邻接链表,然后对每个花园的邻接花园进行遍历,建立一个颜色容器,循环这些邻接花园并在颜色容器去除花园所占的颜色,最后加入颜色容器剩下的第一个颜色给该花园即可。

代码:

 1 class Solution {
 2 public:
 3     vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
 4         vector<vector<int>> graph(n);
 5         vector<int> res(n,0);
 6         for(auto& a:paths){
 7             graph[a[0]-1].push_back(a[1]-1);
 8             graph[a[1]-1].push_back(a[0]-1);
 9         }
10         for(int i=0;i<n;++i){
11             set<int> color{1,2,3,4};
12             for(int j=0;j<graph[i].size();++j){
13                 color.erase(res[graph[i][j]]);
14             }
15             res[i]=*color.begin();
16         }
17         return res;
18     }
19 };

 

另外一种做法使用hash邻接表做,每个花园的邻接点的颜色存入hash表里。当对一个花园染色,我们就遍历他的邻居节点,在遍历4种颜色,如果有一种没有染在他的邻居节点,那么我们就将花园染上这个颜色,并通过hash表告知他的邻居节点我染上了这个颜色。

代码:

 1 class Solution {
 2 public:
 3     vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
 4         vector<vector<int>> graph(n);
 5         unordered_map<int,unordered_set<int>> neicolor;
 6         vector<int> res(n,0);
 7         for(auto& a:paths){
 8             graph[a[0]-1].push_back(a[1]-1);
 9             graph[a[1]-1].push_back(a[0]-1);
10         }
11         res[0]=1;
12         for(auto& nei:graph[0]){
13             neicolor[nei].insert(1);
14         }
15         for(int i=1;i<n;i++){
16             for(int j=1;j<=4;j++){//寻找可以染色的颜色
17                 if(!neicolor[i].count(j)){ //花园i的邻居花园没有染上j的颜色
18                     res[i]=j; //那么我们就加上j颜色给花园i
19                     for(auto& nei:graph[i]){
20                         neicolor[nei].insert(j); //然后告诉 i的邻居花园 i染上了颜色j
21                     }
22                     break; //只要染上一种颜色就可以结束寻找可染色的颜色的循环
23                 }
24             }
25         }
26         return res;
27     }
28 };

 

posted @ 2021-03-26 10:34  Mrsdwang  阅读(39)  评论(0)    收藏  举报