817リンクされたリストコンポーネント**
https://leetcode.com/problems/linked-list-components/
タイトル説明
私たちは、含むリンクリストのヘッドノードヘッドを与えられている一意の整数値を。
また、リスト与えられているG
、リンクリスト内の値のサブセットを。
で接続されているコンポーネントの数を返しますG
彼らはリンクリストに連続して表示された場合に二つの値が接続されています、。
例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.
例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.
注意:
- 場合は
N
ヘッドによって与えられたリンクリストの長さは、あります1 <= N <= 10000
。 - リンクされたリスト内の各ノードの値は、範囲内であろう
[0, N - 1]
。 1 <= G.length <= 10000
。G
リンクリスト内のすべての値のサブセットです。
C ++の実装1
この質問は、最初のバリューチェーン内のすべてのユニークで、そして、問題の意味を理解することが重要であるG
ノードのリンクリストからの値は、要求G
中国聯通の数は、このような構成要素を持っています:
链表: 1->2->3->4->5->6->7->8
G : [1, 2, 3, 5, 6, 8]
だから、ユニコムは、すなわち、3つのコンポーネントがあります。
1->2->3
5->6
8->
我々はユニコム作られたコンポーネントの状態を知っているので、最後のノードはrecord
後継者を見つけることができません。
class Solution {
public:
int numComponents(ListNode* head, vector<int>& G) {
unordered_set<int> record(G.begin(), G.end());
auto p = head;
int res = 0;
while (p) {
if (record.count(p->val) && (!p->next || !record.count(p->next->val)))
res ++;
p = p->next;
}
return res;
}
};