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.{}括起来的是集合,-+都可以直接对集合进行操作。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值