题目:
分析:
应该遵循使用颜色最少的原则。
看评论题解区的大佬:
复习邻接表法:
如上图所示:
分为两部分,左边是所有的起始点,右边是一系列的与起始点相邻的结点,而每一行中,右边的点之间是不体现关系的,
邻接表的思路:
遍历每一个点,遍历到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.{}括起来的是集合,-+都可以直接对集合进行操作。