Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 추가 공간 없이 정렬된 단일 연결에서 주어진 합계에 대한 쌍 찾기

<시간/>

단일 연결 목록과 값 x가 있다고 가정합니다. 합이 x와 같은 쌍을 찾아야 합니다. 추가 공간을 사용할 수 없으며 예상 시간 복잡도는 O(n)입니다.

따라서 입력이 4→7→8→9→10→11→12, x =19인 경우 출력은 [(7, 12), (8, 11), (9, 10)]

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • convert_to_xor() 함수를 정의하면 시작됩니다.

  • 이전 :=NULL

  • 시작이 NULL인 동안 수행 -

    • next_list_node :=다음 시작

    • 다음 시작 :=next_list_node 및 이전 주소의 XOR

    • 이전 :=시작

    • 시작 :=next_list_node

  • 기본 방법에서 다음을 수행하십시오 -

  • 첫 번째 :=시작

  • next_list_node :=NULL, 이전 :=NULL, 두 번째 :=시작

  • 초의 다음이 이전과 같지 않은 동안 수행 -

    • 온도 :=초

    • second :=(next of second, prev)

      주소의 XOR
    • 이전 :=임시

  • next_list_node :=NULL

  • 이전 :=NULL

  • 플래그 :=거짓

  • 동안(첫 번째는 NULL과 같지 않고 두 번째는 NULL과 같지 않고 첫 번째는 두 번째와 같지 않고 첫 번째는 next_list_node와 같지 않음), do -

    • 첫 번째 데이터 + 두 번째 데이터가 x와 같으면 -

      • 첫 번째 쌍 데이터 표시, 두 번째 데이터 표시

      • 플래그 :=참

      • 임시 :=첫 번째

      • first :=(next of first,prev)

        주소의 XOR
      • 이전 :=임시

      • 온도 :=초

      • 두 번째 :=다음 두 번째 주소의 XOR, next_list_node)

      • next_list_node :=임시

    • 그렇지 않으면

      • 첫 번째 데이터 + 두 번째 데이터

        • 임시 :=첫 번째

        • first :=(next of first,prev)

          주소의 XOR
        • 이전 :=임시

      • 그렇지 않으면

        • 온도 :=초

        • second :=(next of second, next_list_node)

          주소의 XOR
        • next_list_node :=임시

  • 플래그가 false와 같으면 -

    • 쌍이 없습니다

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include<bits/stdc++.h>
using namespace std;
class ListNode {
public:
   int data;
   ListNode *next;
   ListNode(int data) {
      this->data = data;
      next = NULL;
   }
};
ListNode *make_list(vector<int> v) {
   ListNode *start = new ListNode(v[0]);
   for (int i = 1; i < v.size(); i++) {
      ListNode *ptr = start;
      while (ptr->next != NULL) {
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return start;
}
ListNode* XOR (ListNode *a, ListNode *b) {
   return (ListNode*) ((uintptr_t) (a) ^ (uintptr_t) (b));
}
void convert_to_xor(ListNode *start) {
   ListNode *next_list_node;
   ListNode *prev = NULL;
   while (start != NULL) {
      next_list_node = start->next;
      start->next = XOR(next_list_node, prev);
      prev = start;
      start = next_list_node;
   }
}
void get_pared_sum(ListNode *start, int x) {
   ListNode *first = start;
   ListNode *next_list_node = NULL, *prev = NULL;
   ListNode *second = start;
   while (second->next != prev) {
      ListNode *temp = second;
      second = XOR(second->next, prev);
      prev = temp;
   }
   next_list_node = NULL;
   prev = NULL;
   bool flag = false;
   while (first != NULL && second != NULL && first != second && first != next_list_node) {
      if ((first->data + second->data)==x) {
         cout << "(" << first->data << ","<< second->data << ")" << endl;
         flag = true;
         ListNode *temp = first;
         first = XOR(first->next,prev);
         prev = temp;
         temp = second;
         second = XOR(second->next, next_list_node);
         next_list_node = temp;
      }
      else{
         if ((first->data + second->data) < x) {
            ListNode *temp = first;
            first = XOR(first->next,prev);
            prev = temp;
         }
         else{
            ListNode *temp = second;
            second = XOR(second->next, next_list_node);
            next_list_node = temp;
         }
      }
   }
   if (flag == false)
      cout << "No pair found" << endl;
}
int main() {
   vector<int> v = {4,7,8,9,10,11,12};
   ListNode* start = make_list(v);
   int x = 19;
   convert_to_xor(start);
   get_pared_sum(start,x);
}

입력

{4,7,8,9,10,11,12}

출력

(7,12) (8,11) (9,10)