logo

합계가 나머지 배열의 합계와 같은 배열에 두 개의 요소가 있는지 확인하십시오.

우리는 정수 배열을 가지고 있으며, 이 두 요소의 합이 배열의 나머지 요소의 합과 같도록 배열에서 두 개의 요소를 찾아야 합니다. 

예:  

Input : arr[] = {2 11 5 1 4 7} Output : Elements are 4 and 11 Note that 4 + 11 = 2 + 5 + 1 + 7 Input : arr[] = {2 4 2 1 11 15} Output : Elements do not exist 

에이 간단한 해결책 모든 쌍을 하나씩 고려하여 그 합을 구하고 그 합을 나머지 요소의 합과 비교하는 것입니다. 합계가 나머지 요소와 동일한 쌍을 찾으면 해당 쌍을 인쇄하고 true를 반환합니다. 이 솔루션의 시간 복잡도는 O(n3)



효율적인 솔루션 모든 배열 요소의 합을 구하는 것입니다. 이 합계를 '합계'로 둡니다. 이제 작업은 합이 합/2인 쌍을 찾는 것으로 축소됩니다. 

또 다른 최적화는 기본적으로 동일한 합으로 두 부분으로 나누기 때문에 전체 배열의 합이 짝수인 경우에만 쌍이 존재할 수 있다는 것입니다.

  1. 전체 배열의 합을 구합니다. 이 합을 '합'이라고 합시다. 
  2. 합계가 홀수이면 false를 반환합니다. 
  3. 논의된 해싱 기반 방법을 사용하여 합계가 'sum/2'와 같은 쌍을 찾습니다. 여기 방법 2와 같습니다. 쌍이 발견되면 인쇄하고 true를 반환합니다. 
  4. 쌍이 없으면 false를 반환합니다.

다음은 위 단계의 구현입니다.

C++
// C++ program to find whether two elements exist // whose sum is equal to sum of rest of the elements. #include    using namespace std; // Function to check whether two elements exist // whose sum is equal to sum of rest of the elements. bool checkPair(int arr[] int n) {  // Find sum of whole array  int sum = 0;  for (int i = 0; i < n; i++)  sum += arr[i];  // If sum of array is not even then we can not  // divide it into two part  if (sum % 2 != 0)  return false;  sum = sum / 2;  // For each element arr[i] see if there is  // another element with value sum - arr[i]  unordered_set<int> s;  for (int i = 0; i < n; i++) {  int val = sum - arr[i];  // If element exist than return the pair  if (s.find(val) != s.end()) {  printf('Pair elements are %d and %dn' arr[i]  val);  return true;  }  s.insert(arr[i]);  }  return false; } // Driver program. int main() {  int arr[] = { 2 11 5 1 4 7 };  int n = sizeof(arr) / sizeof(arr[0]);  if (checkPair(arr n) == false)  printf('No pair found');  return 0; } 
Java
// Java program to find whether two elements exist // whose sum is equal to sum of rest of the elements. import java.util.*; class GFG {  // Function to check whether two elements exist  // whose sum is equal to sum of rest of the elements.  static boolean checkPair(int arr[] int n)  {  // Find sum of whole array  int sum = 0;  for (int i = 0; i < n; i++) {  sum += arr[i];  }  // If sum of array is not even then we can not  // divide it into two part  if (sum % 2 != 0) {  return false;  }  sum = sum / 2;  // For each element arr[i] see if there is  // another element with value sum - arr[i]  HashSet<Integer> s = new HashSet<Integer>();  for (int i = 0; i < n; i++) {  int val = sum - arr[i];  // If element exist than return the pair  if (s.contains(val)  && val == (int)s.toArray()[s.size() - 1]) {  System.out.printf(  'Pair elements are %d and %dn' arr[i]  val);  return true;  }  s.add(arr[i]);  }  return false;  }  // Driver program.  public static void main(String[] args)  {  int arr[] = { 2 11 5 1 4 7 };  int n = arr.length;  if (checkPair(arr n) == false) {  System.out.printf('No pair found');  }  } } /* This code contributed by PrinciRaj1992 */ 
Python3
# Python3 program to find whether  # two elements exist whose sum is # equal to sum of rest of the elements.  # Function to check whether two  # elements exist whose sum is equal  # to sum of rest of the elements.  def checkPair(arr n): s = set() sum = 0 # Find sum of whole array  for i in range(n): sum += arr[i] # / If sum of array is not  # even then we can not  # divide it into two part  if sum % 2 != 0: return False sum = sum / 2 # For each element arr[i] see if  # there is another element with  # value sum - arr[i]  for i in range(n): val = sum - arr[i] if arr[i] not in s: s.add(arr[i]) # If element exist than  # return the pair  if val in s: print('Pair elements are' arr[i] 'and' int(val)) # Driver Code  arr = [2 11 5 1 4 7] n = len(arr) if checkPair(arr n) == False: print('No pair found') # This code is contributed  # by Shrikant13 
C#
// C# program to find whether two elements exist // whose sum is equal to sum of rest of the elements. using System;  using System.Collections.Generic;  class GFG  {    // Function to check whether two elements exist  // whose sum is equal to sum of rest of the elements.  static bool checkPair(int []arr int n)  {  // Find sum of whole array  int sum = 0;  for (int i = 0; i < n; i++)  {  sum += arr[i];  }  // If sum of array is not even then we can not  // divide it into two part  if (sum % 2 != 0)   {  return false;  }  sum = sum / 2;  // For each element arr[i] see if there is  // another element with value sum - arr[i]  HashSet<int> s = new HashSet<int>();  for (int i = 0; i < n; i++)  {  int val = sum - arr[i];  // If element exist than return the pair  if (s.Contains(val))  {  Console.Write('Pair elements are {0} and {1}n'  arr[i] val);  return true;  }  s.Add(arr[i]);  }  return false;  }  // Driver code  public static void Main(String[] args)  {  int []arr = {2 11 5 1 4 7};  int n = arr.Length;  if (checkPair(arr n) == false)   {  Console.Write('No pair found');  }  } } // This code contributed by Rajput-Ji 
PHP
 // PHP program to find whether two elements exist // whose sum is equal to sum of rest of the elements. // Function to check whether two elements exist // whose sum is equal to sum of rest of the elements. function checkPair(&$arr $n) { // Find sum of whole array $sum = 0; for ($i = 0; $i < $n; $i++) $sum += $arr[$i]; // If sum of array is not even then we  // can not divide it into two part if ($sum % 2 != 0) return false; $sum = $sum / 2; // For each element arr[i] see if there is // another element with value sum - arr[i] $s = array(); for ($i = 0; $i < $n; $i++) { $val = $sum - $arr[$i]; // If element exist than return the pair if (array_search($val $s)) { echo 'Pair elements are ' . $arr[$i] . ' and ' . $val . 'n'; return true; } array_push($s $arr[$i]); } return false; } // Driver Code $arr = array(2 11 5 1 4 7); $n = sizeof($arr); if (checkPair($arr $n) == false) echo 'No pair found'; // This code is contributed by ita_c ?> 
JavaScript
<script> // Javascript program to find  // whether two elements exist // whose sum is equal to sum of rest // of the elements.     // Function to check whether   // two elements exist  // whose sum is equal to sum of   // rest of the elements.  function checkPair(arrn)  {  // Find sum of whole array  let sum = 0;  for (let i = 0; i < n; i++)  {  sum += arr[i];  }    // If sum of array is not even then we can not  // divide it into two part  if (sum % 2 != 0)   {  return false;  }    sum = Math.floor(sum / 2);    // For each element arr[i] see if there is  // another element with value sum - arr[i]  let s = new Set();  for (let i = 0; i < n; i++)  {  let val = sum - arr[i];    // If element exist than return the pair    if(!s.has(arr[i]))  {  s.add(arr[i])  }    if (s.has(val) )   {  document.write('Pair elements are '+  arr[i]+' and '+ val+'  
'
); return true; } s.add(arr[i]); } return false; } // Driver program. let arr=[2 11 5 1 4 7]; let n = arr.length; if (checkPair(arr n) == false) { document.write('No pair found'); } // This code is contributed by rag2127 </script>

산출
Pair elements are 4 and 11

시간 복잡도 : 에) . 순서가 없는_세트 해싱을 사용하여 구현됩니다. 여기서 시간 복잡도 해시 검색 및 삽입은 O(1)로 가정됩니다.
보조 공간: 에)

또 다른 효율적인 접근 방식(공간 최적화): 먼저 배열을 정렬하겠습니다. 바이너리 검색 . 그런 다음 전체 배열을 반복하고 arr[index] + a[i] == Rest sum of the array 가 되도록 i와 쌍을 이루는 배열에 인덱스가 있는지 확인합니다. 이진 검색 프로그램을 수정하여 배열에서 색인을 찾는 데 이진 검색을 사용할 수 있습니다. 쌍이 존재하면 해당 쌍을 인쇄하십시오. 그렇지 않으면 쌍이 존재하지 않는다고 인쇄합니다.

다음은 위의 접근 방식을 구현한 것입니다.

C++
// C++ program for the above approach #include   using namespace std; // Function to Find if a index exist in array such that // arr[index] + a[i] == Rest sum of the array int binarysearch(int arr[] int n int i int Totalsum) {   int l = 0 r = n - 1  index = -1;//initialize as -1  while (l <= r)   { int mid = (l + r) / 2;    int Pairsum = arr[mid] + arr[i];//pair sum  int Restsum = Totalsum - Pairsum;//Rest sum    if ( Pairsum == Restsum )  {  if( index != i )// checking a pair has same position or not  { index = mid; }//Then update index -1 to mid    // Checking for adjacent element  else if(index == i && mid>0 && arr[mid-1]==arr[i])  { index = mid-1; }//Then update index -1 to mid-1    else if(index == i && mid<n-1 && arr[mid+1]==arr[i])   { index = mid+1; } //Then update index-1 to mid+1   break;   }  else if (Pairsum > Restsum)   { // If pair sum is greater than rest sum  our index will  // be in the Range [mid+1R]  l = mid + 1;  }  else {  // If pair sum is smaller than rest sum  our index will  // be in the Range [Lmid-1]  r = mid - 1;  }  }  // return index=-1 if a pair not exist with arr[i]  // else return index such that arr[i]+arr[index] == sum of rest of arr  return index; } // Function to check if a pair exist such their sum  // equal to rest of the array or not  bool checkPair(int arr[]int n) { int Totalsum=0;  sort(arr  arr + n);//sort arr for Binary search    for(int i=0;i<n;i++)  { Totalsum+=arr[i]; } //Finding total sum of the arr    for(int i=0;i<n;i++)  { // If index is -1  Means arr[i] can't pair with any element   // else arr[i]+a[index] == sum of rest of the arr  int index = binarysearch(arr n iTotalsum) ;    if(index != -1) {   cout<<'Pair elements are '<< arr[i]<<' and '<< arr[index];  return true;  }  }  return false;//Return false if a pair not exist } // Driver Code int main() {  int arr[] = {2 11 5 1 4 7};  int n = sizeof(arr)/sizeof(arr[0]);    //Function call  if (checkPair(arr n) == false)  { cout<<'No pair found'; }  return 0; } // This Approach is contributed by nikhilsainiofficial546  
Java
// Java program for the above approach import java.util.*; class GFG {  // Function to Find if a index exist in array such that  // arr[index] + a[i] == Rest sum of the array  static int binarysearch(int arr[] int n int i  int Totalsum)  {  int l = 0 r = n - 1 index = -1; // initialize as -1  while (l <= r) {  int mid = (l + r) / 2;  int Pairsum = arr[mid] + arr[i]; // pair sum  int Restsum = Totalsum - Pairsum; // Rest sum  if (Pairsum == Restsum) {  if (index != i) // checking a pair has same  // position or not  {  index = mid;  } // Then update index -1 to mid  // Checking for adjacent element  else if (index == i && mid > 0  && arr[mid - 1] == arr[i]) {  index = mid - 1;  } // Then update index -1 to mid-1  else if (index == i && mid < n - 1  && arr[mid + 1] == arr[i]) {  index = mid + 1;  } // Then update index-1 to mid+1  break;  }  else if (Pairsum > Restsum) {  // If pair sum is greater than rest sum   // our index will be in the Range [mid+1R]  l = mid + 1;  }  else {  // If pair sum is smaller than rest sum   // our index will be in the Range [Lmid-1]  r = mid - 1;  }  }  // return index=-1 if a pair not exist with arr[i]  // else return index such that arr[i]+arr[index] ==  // sum of rest of arr  return index;  }  // Function to check if a pair exist such their sum  // equal to rest of the array or not  static boolean checkPair(int arr[] int n)  {  int Totalsum = 0;  Arrays.sort(arr); // sort arr for Binary search  for (int i = 0; i < n; i++) {  Totalsum += arr[i];  } // Finding total sum of the arr  for (int i = 0; i < n; i++) {  // If index is -1  Means arr[i] can't pair with  // any element else arr[i]+a[index] == sum of  // rest of the arr  int index = binarysearch(arr n i Totalsum);  if (index != -1) {  System.out.println('Pair elements are '  + arr[i] + ' and '  + arr[index]);  return true;  }  }  return false; // Return false if a pair not exist  }  // Driver Code  public static void main(String[] args)  {  int arr[] = { 2 11 5 1 4 7 };  int n = arr.length;  // Function call  if (checkPair(arr n) == false) {  System.out.println('No pair found');  }  } } 
Python3
# Python program for the above approach # Function to find if a index exist in array such that # arr[index] + a[i] == Rest sum of the array def binarysearch(arr n i Totalsum): l = 0 r = n - 1 index = -1 # Initialize as -1 while l <= r: mid = (l + r) // 2 Pairsum = arr[mid] + arr[i] # Pair sum Restsum = Totalsum - Pairsum # Rest sum if Pairsum == Restsum: if index != i: # Checking if a pair has the same position or not index = mid # Then update index -1 to mid # Checking for adjacent element elif index == i and mid > 0 and arr[mid - 1] == arr[i]: index = mid - 1 # Then update index -1 to mid-1 elif index == i and mid < n - 1 and arr[mid + 1] == arr[i]: index = mid + 1 # Then update index-1 to mid+1 break elif Pairsum > Restsum: # If pair sum is greater than rest sum our index will # be in the Range [mid+1R] l = mid + 1 else: # If pair sum is smaller than rest sum our index will # be in the Range [Lmid-1] r = mid - 1 # Return index=-1 if a pair not exist with arr[i] # else return index such that arr[i]+arr[index] == sum of rest of arr return index # Function to check if a pair exists such that their sum # equals to rest of the array or not def checkPair(arr n): Totalsum = 0 arr = sorted(arr) # Sort arr for Binary search for i in range(n): Totalsum += arr[i] # Finding total sum of the arr for i in range(n): # If index is -1 means arr[i] can't pair with any element # else arr[i]+a[index] == sum of rest of the arr index = binarysearch(arr n i Totalsum) if index != -1: print('Pair elements are' arr[i] 'and' arr[index]) return True return False # Return false if a pair not exist # Driver Code arr = [2 11 5 1 4 7] n = len(arr) # Function call if checkPair(arr n) == False: print('No pair found') 
C#
using System; class GFG {  // Function to Find if a index exist in array such that  // arr[index] + a[i] == Rest sum of the array  static int BinarySearch(int[] arr int n int i int totalSum)  {  int l = 0 r = n - 1 index = -1; // initialize as -1  while (l <= r)  {  int mid = (l + r) / 2;  int pairSum = arr[mid] + arr[i]; // pair sum  int restSum = totalSum - pairSum; // rest sum  if (pairSum == restSum)  {  if (index != i) // checking a pair has same  // position or not  {  index = mid;  } // Then update index -1 to mid  // Checking for adjacent element  else if (index == i && mid > 0  && arr[mid - 1] == arr[i])  {  index = mid - 1;  } // Then update index -1 to mid-1  else if (index == i && mid < n - 1  && arr[mid + 1] == arr[i])  {  index = mid + 1;  } // Then update index-1 to mid+1  break;  }  else if (pairSum > restSum)  {  // If pair sum is greater than rest sum   // our index will be in the Range [mid+1R]  l = mid + 1;  }  else  {  // If pair sum is smaller than rest sum   // our index will be in the Range [Lmid-1]  r = mid - 1;  }  }  // return index=-1 if a pair not exist with arr[i]  // else return index such that arr[i]+arr[index] ==  // sum of rest of arr  return index;  }  // Function to check if a pair exist such their sum  // equal to rest of the array or not  static bool CheckPair(int[] arr int n)  {  int totalSum = 0;  Array.Sort(arr); // sort arr for Binary search  for (int i = 0; i < n; i++)  {  totalSum += arr[i];  } // Finding total sum of the arr  for (int i = 0; i < n; i++)  {  // If index is -1  Means arr[i] can't pair with  // any element else arr[i]+a[index] == sum of  // rest of the arr  int index = BinarySearch(arr n i totalSum);  if (index != -1)  {  Console.WriteLine('Pair elements are ' + arr[i] + ' and ' + arr[index]);  return true;  }  }  return false; // Return false if a pair not exist  }  // Driver Code  static void Main(string[] args)  {  int[] arr = { 2 11 5 1 4 7 };  int n = arr.Length;  // Function call  if (!CheckPair(arr n))  {  Console.WriteLine('No pair found');  }  } } 
JavaScript
// JavaScript program for the above approach // function to find if a index exist in array such that // arr[index] + a[i] == Rest sum of the array function binarysearch(arr n i TotalSum){  let l = 0;  let r = n-1;  let index = -1;    while(l <= r){  let mid = parseInt((l+r)/2);  let Pairsum = arr[mid] + arr[i];  let Restsum = TotalSum - Pairsum;    if ( Pairsum == Restsum )  {  if( index != i )// checking a pair has same position or not  { index = mid; }//Then update index -1 to mid    // Checking for adjacent element  else if(index == i && mid>0 && arr[mid-1]==arr[i])  { index = mid-1; }//Then update index -1 to mid-1    else if(index == i && mid<n-1 && arr[mid+1]==arr[i])  { index = mid+1; } //Then update index-1 to mid+1   break;  }  else if (Pairsum > Restsum)  { // If pair sum is greater than rest sum  our index will  // be in the Range [mid+1R]  l = mid + 1;  }  else {  // If pair sum is smaller than rest sum  our index will  // be in the Range [Lmid-1]  r = mid - 1;  }  }  // return index=-1 if a pair not exist with arr[i]  // else return index such that arr[i]+arr[index] == sum of rest of arr  return index; } // Function to check if a pair exist such their sum // equal to rest of the array or not function checkPair(arr n){  let Totalsum = 0;  arr.sort(function(a b){return a - b});    for(let i=0;i<n;i++)  { Totalsum+=arr[i]; } //Finding total sum of the arr    for(let i=0;i<n;i++)  { // If index is -1  Means arr[i] can't pair with any element  // else arr[i]+a[index] == sum of rest of the arr  let index = binarysearch(arr n iTotalsum) ;    if(index != -1) {  console.log('Pair elements are ' + arr[i] + ' and ' + arr[index]);  return true;  }  }  return false;//Return false if a pair not exist } // driver code to test above function let arr = [2 11 5 1 4 7]; let n = arr.length; // function call if(checkPair(arr n) == false)   console.log('No Pair Found')    // THIS CODE IS CONTRIBUTED BY YASH AGARWAL(YASHAGARWAL2852002) 

산출
Pair elements are 11 and 4

시간 복잡도 : O(n * 로그) 
보조 공간: 오(1)

int를 double java로 변환

 

퀴즈 만들기