博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
817. Linked List Components(python+cpp)
阅读量:3703 次
发布时间:2019-05-21

本文共 2203 字,大约阅读时间需要 7 分钟。

题目:

We are given head, the head node of a linked list containing unique integer values.

We are also given the list G, a subset of the values in the linked list.
Return the number of connected components in G, where two values are connected if they appear consecutively in the linked list.
Example 1:

Input: head: 0->1->2->3 G = [0, 1, 3] Output: 2 Explanation:  0 and 1 are connected, so [0, 1] and [3] are the two connected components.

Example 2:

Input:  head: 0->1->2->3->4 G = [0, 3, 1, 4] Output: 2 Explanation:  0 and 1 are connected, 3 and 4 are connected, so [0, 1] and [3, 4] are、】the two connected components.

Note:

If N is the length of the linked list given by head, 1 <= N <= 10000.
The value of each node in the linked list will be in the range [0, N - 1].
1 <= G.length <= 10000.
G is a subset of all values in the linked list.

解释:

看下题目中所给的第二个例子:
liked list: 0->1->2->3->4
I highlighed the subset G in linked list with* italic *
斜体来强调了G中的子集,题目转换为有多少个斜体部分,一个斜体部分就是一个connected components,我们只需要数斜体部分的尾部的个数即可。
python代码:

# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def numComponents(self, head, G):        """        :type head: ListNode        :type G: List[int]        :rtype: int        """        res=0        setG=set(G)        while head!=None:            if (head.val in setG ) and (head.next==None or head.next.val not in setG):                res+=1            head=head.next        return res

为什么同样的代码,c++超时?

c++用set速度查找太慢了,需要用一个长度为10000的bool类型的数组来判断当前的数字是否在G中出现。
c++代码:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */#include 
using namespace std;class Solution {
public: int numComponents(ListNode* head, vector
& G) {
vector
setG(10000,false); for(auto num:G) setG[num]=true; int result=0; while(head) {
if (setG[head->val]&& (!head->next || !setG[head->next->val] )) result++; head=head->next; } return result; }};

总结:

转载地址:http://vwmcn.baihongyu.com/

你可能感兴趣的文章
基于Spring boot+Vue的在线考试系统
查看>>
大数据学习路线
查看>>
前端学习路线
查看>>
推荐几个单机游戏下载网、高质量图片下载网
查看>>
数据库查询
查看>>
单臂路由配置
查看>>
静态路由及动态路由 RIP配置
查看>>
现代密码学:AES
查看>>
现代密码学:密码协议
查看>>
现代密码学:密钥管理
查看>>
数据库增删改
查看>>
RSA公钥
查看>>
【总】现代密码学复习要点总结(谷利泽)
查看>>
【sql-server 数据库 命令大全】
查看>>
数据结构与算法
查看>>
C/C++总结
查看>>
计算机组成原理总结
查看>>
1.3 QT界面美化
查看>>
2 QT数据传输(MVC)
查看>>
3.QT逻辑交互(信号槽)
查看>>