817リンクされたリストコンポーネント**

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;
    }
};
公開された455元の記事 ウォンの賞賛8 ビュー20000 +

おすすめ

転載: blog.csdn.net/Eric_1993/article/details/104914712