題目地址:
https://www.lintcode.com/problem/linked-list-components/description
給定一個鏈表,題目保證鏈表中數字彼此不同,再給定一個數組;如果鏈表中的兩個節點和,在之前並且從到的路徑上所有節點都屬於(或者在之前並且從到的路徑上所有節點都屬於),那麼我們說與等價。容易驗證這是個等價關係。問鏈表裏有多少個等價類。
因爲要快速查詢某個數是否在裏,我們先將的所有數加進一個哈希表。接着從鏈表頭開始遍歷,遇到在中的數的時候記等價類個數加一,接着將指針不停向後移動直到走到不在裏的數爲止,然後重複上述過程。代碼如下:
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;
}
}
時間複雜度,空間。