【Lintcode】1371. Linked List Components

題目地址:

https://www.lintcode.com/problem/linked-list-components/description

給定一個鏈表,題目保證鏈表中數字彼此不同,再給定一個數組GG;如果鏈表中的兩個節點aabbaabb之前並且從aabb的路徑上所有節點都屬於GG(或者bbaa之前並且從bbaa的路徑上所有節點都屬於GG),那麼我們說aabb等價。容易驗證這是個等價關係。問鏈表裏有多少個等價類。

因爲要快速查詢某個數是否在GG裏,我們先將GG的所有數加進一個哈希表。接着從鏈表頭開始遍歷,遇到在GG中的數的時候記等價類個數加一,接着將指針不停向後移動直到走到不在GG裏的數爲止,然後重複上述過程。代碼如下:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    /**
     * @param head: the head
     * @param G: an array
     * @return: the number of connected components in G
     */
    public int numComponents(ListNode head, int[] G) {
        // Write your code here
        int res = 0;
        Set<Integer> set = new HashSet<>();
        for (int i : G) {
            set.add(i);
        }
        
        ListNode dummy = new ListNode(0), prev = dummy;
        dummy.next = head;
        
        while (prev.next != null) {
        	// 走到了G裏的數,記等價類個數res加一,
        	// 並把prev向後移動直到走到鏈表末尾或者走到了某個G外的數爲止
            if (set.contains(prev.next.val)) {
                res++;
                while (prev.next != null && set.contains(prev.next.val)) {
                    prev = prev.next;
                }
            } else {
                prev = prev.next;
            }
        }
        
        return res;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

時間複雜度O(n)O(n),空間O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章