우리가 머리를 주었다고 가정합니다. 이것은 고유한 정수 값을 포함하는 연결 목록의 헤드 노드입니다. 이제 연결 목록에 있는 값의 하위 집합인 목록 G도 제공됩니다. 연결 리스트에 연속적으로 나타나면 두 값이 연결되는 G에서 연결된 구성 요소의 수를 찾아야 합니다. 따라서 목록이 [0,1,2,3]이고 G =[0,1,3]인 경우 0과 1이 연결되어 있으므로 출력은 2가 되므로 두 개의 목록 [0,1]과 [3].
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- ret :=0, 집합 s를 만들고 G의 모든 요소를 s에 삽입
- 플래그 :=거짓
- head가 null이 아닌 동안
- x :=헤드 값
- s에 x가 있으면
- 플래그가 거짓이면 ret를 1 증가
- 플래그 :=참
- 그렇지 않으면 플래그 설정 :=false
- head :=머리 옆
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class ListNode{
public:
int val;
ListNode *next;
ListNode(int data){
val = data;
next = NULL;
}
};
ListNode *make_list(vector<int> v){
ListNode *head = new ListNode(v[0]);
for(int i = 1; i<v.size(); i++){
ListNode *ptr = head;
while(ptr->next != NULL){
ptr = ptr->next;
}
ptr->next = new ListNode(v[i]);
}
return head;
}
class Solution {
public:
int numComponents(ListNode* head, vector<int>& G) {
int ret = 0;
set < int > s;
for(int i = 0; i < G.size(); i++)s.insert(G[i]);
bool flag = false;
while(head){
int x = head->val;
if(s.count(x)){
if(!flag) ret++;
flag = true;
}else flag = false;
head = head->next;
}
return ret;
}
};
main(){
vector<int> v1 = {0,1,2,3};
vector<int> v2 = {0,1,3};
ListNode *h1 = make_list(v1);
Solution ob;
cout << (ob.numComponents(h1, v2));
} 입력
[0,1,2,3] [0,1,3]
출력
2