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 };

浙公网安备 33010602011771号