欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode:1042. 不邻接植花(图)

程序员文章站 2022-06-03 21:06:39
...

题目:

分析:

应该遵循使用颜色最少的原则。
看评论题解区的大佬:
复习邻接表法:
leetcode:1042. 不邻接植花(图)
如上图所示:
分为两部分,左边是所有的起始点,右边是一系列的与起始点相邻的结点,而每一行中,右边的点之间是不体现关系的,

邻接表的思路:
遍历每一个点,遍历到i点时,看与其相邻的点还没有染什么颜色,就给他染顺序中的第一个。

代码:c++

 int N;
 vector<vector<int> > p;
 //构造邻接表 
 vector<int> A[N];
 for(int i=0;i<p.size();i++)
 {
  A[p[i][0]-1].push_back(p[i][1]-1);
  A[p[i][1]-1].push_back(p[i][0]-1);
 }
 vector<int> D(N,0);
  for(int i=0; i<N; i++)
  {
        set<int> color{1,2,3,4};
        for (int j=0; j<A[i].size(); j++)
  {
            color.erase(D[A[i][j]]);
        }
            D[i]=*(color.begin());
        }
    return D;

分析大佬代码才有提升:

1.set等集合的初值不是只有一个一个的赋值。
2.临界表的实现用: vector A[N]; 。
3.还是vector A[N]; 有没有必要 vector<vector > p; 这么复杂。
4.*(color.begin());访问元素的方法。
5.set的erase 参数是删除指定的值,而不是下标,况且人家没有下标。

python代码:

class Solution:
    def gardenNoAdj(self, N: int, paths: List[List[int]]) -> List[int]:
        res = [0]*N
        G = [[] for _ in range(N)]
        for x, y in paths:
            G[x - 1].append(y - 1)
            G[y - 1].append(x - 1)
        for i in range(N):
            res[i] = ({1,2,3,4} - {res[j] for j in G[i]}).pop()
        return res

分析:技巧性是真的强!

1.G = [[] for _ in range(N)] 列表的元素是一个列表,for _ in range(N)代表创建了n个。
2.{}括起来的是集合,-+都可以直接对集合进行操作。
leetcode:1042. 不邻接植花(图)

相关标签: