Atrodiet divus trūkstošos skaitļus | 1. komplekts (interesants lineārais laika risinājums)

Dots n unikālu veselu skaitļu masīvs, kur katrs masīva elements atrodas diapazonā [1 n]. Masīvam ir visi atšķirīgie elementi, un masīva lielums ir (n-2). Tādējādi šajā masīvā trūkst divu skaitļu no diapazona. Atrodiet divus trūkstošos skaitļus.

Piemēri:  

Input : arr[] = {1 3 5 6} Output : 2 4 Input : arr[] = {1 2 4} Output : 3 5 Input : arr[] = {1 2} Output : 3 4 

1. metode — O(n) laika sarežģītība un O(n) papildu telpa

1. darbība: Paņemiet Būla masīvu atzīme kas seko visiem masīvā esošajiem elementiem. 
2. darbība: Atkārtojiet no 1 līdz n pārbaudiet katru elementu, ja tas Būla masīvā ir atzīmēts kā patiess, ja nav, tad vienkārši parādiet šo elementu.

C++
   // C++ Program to find two Missing Numbers using O(n)   // extra space   #include          using     namespace     std  ;   // Function to find two missing numbers in range   // [1 n]. This function assumes that size of array   // is n-2 and all array elements are distinct   void     findTwoMissingNumbers  (  int     arr  []     int     n  )   {      // Create a boolean vector of size n+1 and      // mark all present elements of arr[] in it.      vector   <  bool  >     mark  (  n  +  1       false  );      for     (  int     i     =     0  ;     i      <     n  -2  ;     i  ++  )      mark  [  arr  [  i  ]]     =     true  ;      // Print two unmarked elements      cout      < <     'Two Missing Numbers are  n  '  ;      for     (  int     i     =     1  ;     i      <=     n  ;     i  ++  )      if     (  !     mark  [  i  ])      cout      < <     i      < <     ' '  ;      cout      < <     endl  ;   }   // Driver program to test above function   int     main  ()   {      int     arr  []     =     {  1       3       5       6  };      // Range of numbers is 2 plus size of array      int     n     =     2     +     sizeof  (  arr  )  /  sizeof  (  arr  [  0  ]);      findTwoMissingNumbers  (  arr       n  );      return     0  ;   }   
Java
   // Java Program to find two Missing Numbers using O(n)    // extra space    import     java.util.*  ;   class   GFG   {   // Function to find two missing numbers in range    // [1 n]. This function assumes that size of array    // is n-2 and all array elements are distinct    static     void     findTwoMissingNumbers  (  int     arr  []       int     n  )      {         // Create a boolean vector of size n+1 and       // mark all present elements of arr[] in it.       boolean     []  mark     =     new     boolean  [  n  +  1  ]  ;         for     (  int     i     =     0  ;     i      <     n  -  2  ;     i  ++  )         mark  [  arr  [  i  ]]     =     true  ;         // Print two unmarked elements       System  .  out  .  println  (  'Two Missing Numbers are'  );         for     (  int     i     =     1  ;     i      <=     n  ;     i  ++  )         if     (  !     mark  [  i  ]  )         System  .  out  .  print  (  i     +     ' '  );         System  .  out  .  println  ();   }      // Driver code   public     static     void     main  (  String  []     args  )      {      int     arr  []     =     {  1       3       5       6  };         // Range of numbers is 2 plus size of array       int     n     =     2     +     arr  .  length  ;         findTwoMissingNumbers  (  arr       n  );      }   }   // This code is contributed by 29AjayKumar   
Python3
   # Python3 program to find two Missing Numbers using O(n)   # extra space   # Function to find two missing numbers in range   # [1 n]. This function assumes that size of array   # is n-2 and all array elements are distinct   def   findTwoMissingNumbers  (  arr     n  ):   # Create a boolean vector of size n+1 and   # mark all present elements of arr[] in it.   mark   =   [  False   for   i   in   range  (  n  +  1  )]   for   i   in   range  (  0    n  -  2    1  ):   mark  [  arr  [  i  ]]   =   True   # Print two unmarked elements   print  (  'Two Missing Numbers are'  )   for   i   in   range  (  1    n  +  1    1  ):   if   (  mark  [  i  ]   ==   False  ):   print  (  i    end   =   ' '  )   print  (  '  n  '  )   # Driver program to test above function   if   __name__   ==   '__main__'  :   arr   =   [  1     3     5     6  ]   # Range of numbers is 2 plus size of array   n   =   2   +   len  (  arr  )   findTwoMissingNumbers  (  arr     n  );   # This code is contributed by   # Surendra_Gangwar   
C#
   // C# Program to find two Missing Numbers    // using O(n) extra space    using     System  ;   using     System.Collections.Generic  ;          class     GFG   {   // Function to find two missing numbers in range    // [1 n]. This function assumes that size of array    // is n-2 and all array elements are distinct    static     void     findTwoMissingNumbers  (  int     []  arr       int     n  )      {         // Create a boolean vector of size n+1 and       // mark all present elements of arr[] in it.       Boolean     []  mark     =     new     Boolean  [  n     +     1  ];         for     (  int     i     =     0  ;     i      <     n     -     2  ;     i  ++  )         mark  [  arr  [  i  ]]     =     true  ;         // Print two unmarked elements       Console  .  WriteLine  (  'Two Missing Numbers are'  );         for     (  int     i     =     1  ;     i      <=     n  ;     i  ++  )         if     (  !     mark  [  i  ])         Console  .  Write  (  i     +     ' '  );         Console  .  WriteLine  ();   }      // Driver code   public     static     void     Main  (  String  []     args  )      {      int     []  arr     =     {  1       3       5       6  };         // Range of numbers is 2 plus size of array       int     n     =     2     +     arr  .  Length  ;         findTwoMissingNumbers  (  arr       n  );      }   }   // This code contributed by Rajput-Ji   
JavaScript
    <  script  >      // Javascript Program to find two       // Missing Numbers using O(n) extra space          // Function to find two missing numbers in range       // [1 n]. This function assumes that size of array       // is n-2 and all array elements are distinct       function     findTwoMissingNumbers  (  arr       n  )         {         // Create a boolean vector of size n+1 and       // mark all present elements of arr[] in it.       let     mark     =     new     Array  (  n  +  1  );         for     (  let     i     =     0  ;     i      <     n  -  2  ;     i  ++  )         mark  [  arr  [  i  ]]     =     true  ;         // Print two unmarked elements       document  .  write  (  'Two Missing Numbers are'     +     ' 
'
); for ( let i = 1 ; i <= n ; i ++ ) if ( ! mark [ i ]) document . write ( i + ' ' ); document . write ( '
'
); } let arr = [ 1 3 5 6 ]; // Range of numbers is 2 plus size of array let n = 2 + arr . length ; findTwoMissingNumbers ( arr n ); < /script>

Izvade
Two Missing Numbers are 2 4  

2. metode – O(n) laika sarežģītība un O(1) papildu telpa

Ideja ir balstīta uz šis populārs risinājums viena trūkstoša skaitļa atrašanai. Mēs pagarinām risinājumu tā, lai tiktu izdrukāti divi trūkstošie elementi. 
Noskaidrosim 2 trūkstošo skaitļu summu:

  arrSum   => Sum of all elements in the array   sum   (Sum of 2 missing numbers) = (Sum of integers from 1 to n) - arrSum = ((n)*(n+1))/2 – arrSum   avg   (Average of 2 missing numbers) = sum / 2; 
  • Viens no skaitļiem būs mazāks vai vienāds ar vid savukārt otrs būs stingri lielāks par vid . Divi skaitļi nekad nevar būt vienādi, jo visi norādītie skaitļi ir atšķirīgi.
  • Pirmo trūkstošo skaitli varam atrast kā naturālu skaitļu summu no 1 līdz vid t.i., vid.*(vid.+1)/2 mīnus masīva elementu summa, kas ir mazāka par vid
  • Mēs varam atrast otro trūkstošo skaitli, atņemot pirmo trūkstošo skaitli no trūkstošo skaitļu summas

Lai iegūtu labāku skaidrību, apsveriet piemēru 

Input : 1 3 5 6 n = 6 Sum of missing integers = n*(n+1)/2 - (1+3+5+6) = 6. Average of missing integers = 6/2 = 3. Sum of array elements less than or equal to average = 1 + 3 = 4 Sum of natural numbers from 1 to avg = avg*(avg + 1)/2 = 3*4/2 = 6 First missing number = 6 - 4 = 2 Second missing number = Sum of missing integers-First missing number Second missing number = 6-2= 4 

Zemāk ir iepriekš minētās idejas īstenošana.

C++
   // C++ Program to find 2 Missing Numbers using O(1)   // extra space   #include          using     namespace     std  ;   // Returns the sum of the array   int     getSum  (  int     arr  []  int     n  )   {      int     sum     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     +=     arr  [  i  ];      return     sum  ;   }   // Function to find two missing numbers in range   // [1 n]. This function assumes that size of array   // is n-2 and all array elements are distinct   void     findTwoMissingNumbers  (  int     arr  []  int     n  )   {      // Sum of 2 Missing Numbers      int     sum     =     (  n  *  (  n     +     1  ))     /  2     -     getSum  (  arr       n  -2  );      // Find average of two elements      int     avg     =     (  sum     /     2  );      // Find sum of elements smaller than average (avg)      // and sum of elements greater than average (avg)      int     sumSmallerHalf     =     0       sumGreaterHalf     =     0  ;      for     (  int     i     =     0  ;     i      <     n  -2  ;     i  ++  )      {      if     (  arr  [  i  ]      <=     avg  )      sumSmallerHalf     +=     arr  [  i  ];      else      sumGreaterHalf     +=     arr  [  i  ];      }      cout      < <     'Two Missing Numbers are  n  '  ;      // The first (smaller) element = (sum of natural      // numbers upto avg) - (sum of array elements      // smaller than or equal to avg)      int     totalSmallerHalf     =     (  avg  *  (  avg     +     1  ))     /     2  ;      int     smallerElement     =     totalSmallerHalf     -     sumSmallerHalf  ;      cout      < <     smallerElement      < <     ' '  ;      // The second (larger) element = (sum of both       // the elements) - smaller element      cout      < <     sum     -     smallerElement  ;   }   // Driver program to test above function   int     main  ()   {      int     arr  []     =     {  1       3       5       6  };          // Range of numbers is 2 plus size of array      int     n     =     2     +     sizeof  (  arr  )  /  sizeof  (  arr  [  0  ]);          findTwoMissingNumbers  (  arr       n  );          return     0  ;   }   
Java
   // Java Program to find 2 Missing   // Numbers using O(1) extra space   import     java.io.*  ;   class   GFG      {       // Returns the sum of the array   static     int     getSum  (  int     arr  []       int     n  )   {      int     sum     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     +=     arr  [  i  ]  ;      return     sum  ;   }   // Function to find two missing    // numbers in range [1 n]. This   // function assumes that size of    // array is n-2 and all array    // elements are distinct   static     void     findTwoMissingNumbers  (  int     arr  []           int     n  )   {      // Sum of 2 Missing Numbers      int     sum     =     (  n     *     (  n     +     1  ))     /      2     -     getSum  (  arr       n     -     2  );      // Find average of two elements      int     avg     =     (  sum     /     2  );      // Find sum of elements smaller       // than average (avg) and sum of       // elements greater than average (avg)      int     sumSmallerHalf     =     0           sumGreaterHalf     =     0  ;      for     (  int     i     =     0  ;     i      <     n     -     2  ;     i  ++  )      {      if     (  arr  [  i  ]      <=     avg  )      sumSmallerHalf     +=     arr  [  i  ]  ;      else      sumGreaterHalf     +=     arr  [  i  ]  ;      }      System  .  out  .  println  (  'Two Missing '     +         'Numbers are'  );      // The first (smaller) element =       // (sum of natural numbers upto       // avg) - (sum of array elements      // smaller than or equal to avg)      int     totalSmallerHalf     =     (  avg     *         (  avg     +     1  ))     /     2  ;      System  .  out  .  println  (  totalSmallerHalf     -         sumSmallerHalf  );      // The first (smaller) element =       // (sum of natural numbers from      // avg+1 to n) - (sum of array       // elements greater than avg)      System  .  out  .  println  (((  n     *     (  n     +     1  ))     /     2     -         totalSmallerHalf  )     -         sumGreaterHalf  );   }   // Driver Code   public     static     void     main     (  String  []     args  )      {   int     arr  []     =     {  1       3       5       6  };       // Range of numbers is 2   // plus size of array   int     n     =     2     +     arr  .  length  ;       findTwoMissingNumbers  (  arr       n  );   }   }   // This code is contributed by aj_36   
Python3
   # Python Program to find 2 Missing    # Numbers using O(1) extra space    # Returns the sum of the array    def   getSum  (  arr    n  ):   sum   =   0  ;   for   i   in   range  (  0     n  ):   sum   +=   arr  [  i  ]   return   sum   # Function to find two missing    # numbers in range [1 n]. This    # function assumes that size of    # array is n-2 and all array   # elements are distinct    def   findTwoMissingNumbers  (  arr     n  ):   # Sum of 2 Missing Numbers    sum   =   ((  n   *   (  n   +   1  ))   /   2   -   getSum  (  arr     n   -   2  ));   #Find average of two elements    avg   =   (  sum   /   2  );   # Find sum of elements smaller    # than average (avg) and sum    # of elements greater than    # average (avg)    sumSmallerHalf   =   0   sumGreaterHalf   =   0  ;   for   i   in   range  (  0     n   -   2  ):   if   (  arr  [  i  ]    <=   avg  ):   sumSmallerHalf   +=   arr  [  i  ]   else  :   sumGreaterHalf   +=   arr  [  i  ]   print  (  'Two Missing Numbers are'  )   # The first (smaller) element = (sum    # of natural numbers upto avg) - (sum    # of array elements smaller than or   # equal to avg)    totalSmallerHalf   =   (  avg   *   (  avg   +   1  ))   /   2   print  (  str  (  totalSmallerHalf   -   sumSmallerHalf  )   +   ' '  )   # The first (smaller) element = (sum    # of natural numbers from avg+1 to n) -    # (sum of array elements greater than avg)    print  (  str  (((  n   *   (  n   +   1  ))   /   2   -   totalSmallerHalf  )   -   sumGreaterHalf  ))   # Driver Code   arr   =   [  1     3     5     6  ]   # Range of numbers is 2   # plus size of array    n   =   2   +   len  (  arr  )   findTwoMissingNumbers  (  arr     n  )   # This code is contributed   # by Yatin Gupta   
C#
   // C# Program to find 2 Missing   // Numbers using O(1) extra space   using     System  ;   class     GFG   {       // Returns the sum of the array   static     int     getSum  (  int     []  arr       int     n  )   {      int     sum     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     +=     arr  [  i  ];      return     sum  ;   }   // Function to find two missing    // numbers in range [1 n]. This   // function assumes that size of    // array is n-2 and all array    // elements are distinct   static     void     findTwoMissingNumbers  (  int     []  arr           int     n  )   {      // Sum of 2 Missing Numbers      int     sum     =     (  n     *     (  n     +     1  ))     /     2     -         getSum  (  arr       n     -     2  );      // Find average of two elements      int     avg     =     (  sum     /     2  );      // Find sum of elements smaller       // than average (avg) and sum of       // elements greater than average (avg)      int     sumSmallerHalf     =     0           sumGreaterHalf     =     0  ;      for     (  int     i     =     0  ;     i      <     n     -     2  ;     i  ++  )      {      if     (  arr  [  i  ]      <=     avg  )      sumSmallerHalf     +=     arr  [  i  ];      else      sumGreaterHalf     +=     arr  [  i  ];      }      Console  .  WriteLine  (  'Two Missing '     +         'Numbers are '  );      // The first (smaller) element =       // (sum of natural numbers upto       // avg) - (sum of array elements      // smaller than or equal to avg)      int     totalSmallerHalf     =     (  avg     *         (  avg     +     1  ))     /     2  ;      Console  .  WriteLine  (  totalSmallerHalf     -         sumSmallerHalf  );      // The first (smaller) element =       // (sum of natural numbers from      // avg+1 to n) - (sum of array       // elements greater than avg)      Console  .  WriteLine  (((  n     *     (  n     +     1  ))     /     2     -         totalSmallerHalf  )     -         sumGreaterHalf  );   }   // Driver Code    static     public     void     Main     ()   {      int     []  arr     =     {  1       3       5       6  };          // Range of numbers is 2      // plus size of array      int     n     =     2     +     arr  .  Length  ;          findTwoMissingNumbers  (  arr       n  );   }   }   // This code is contributed by ajit   
PHP
      // PHP Program to find 2 Missing   // Numbers using O(1) extra space   // Returns the sum of the array   function   getSum  (  $arr     $n  )   {   $sum   =   0  ;   for   (  $i   =   0  ;   $i    <   $n  ;   $i  ++  )   $sum   +=   $arr  [  $i  ];   return   $sum  ;   }   // Function to find two missing    // numbers in range [1 n]. This    // function assumes that size of    // array is n-2 and all array   // elements are distinct   function   findTwoMissingNumbers  (  $arr     $n  )   {   // Sum of 2 Missing Numbers   $sum   =   (  $n   *   (  $n   +   1  ))   /  2   -   getSum  (  $arr     $n   -   2  );   // Find average of two elements   $avg   =   (  $sum   /   2  );   // Find sum of elements smaller   // than average (avg) and sum of   // elements greater than average (avg)   $sumSmallerHalf   =   0  ;   $sumGreaterHalf   =   0  ;   for   (  $i   =   0  ;   $i    <   $n   -   2  ;   $i  ++  )   {   if   (  $arr  [  $i  ]    <=   $avg  )   $sumSmallerHalf   +=   $arr  [  $i  ];   else   $sumGreaterHalf   +=   $arr  [  $i  ];   }   echo   'Two Missing Numbers are  n  '  ;   // The first (smaller) element =    // (sum of natural numbers upto avg) -    // (sum of array elements smaller    // than or equal to avg)   $totalSmallerHalf   =   (  $avg   *   (  $avg   +   1  ))   /   2  ;   echo   (  $totalSmallerHalf   -   $sumSmallerHalf  )      ' '  ;   // The first (smaller) element =    // (sum of natural numbers from avg +    // 1 to n) - (sum of array elements   // greater than avg)   echo   (((  $n   *   (  $n   +   1  ))   /   2   -   $totalSmallerHalf  )   -   $sumGreaterHalf  );   }   // Driver Code   $arr  =   array   (  1     3     5     6  );   // Range of numbers is   // 2 plus size of array   $n   =   2   +   sizeof  (  $arr  );   findTwoMissingNumbers  (  $arr     $n  );   // This code is contributed by aj_36   ?>   
JavaScript
    <  script  >      // Javascript Program to find 2 Missing      // Numbers using O(1) extra space          // Returns the sum of the array      function     getSum  (  arr       n  )      {      let     sum     =     0  ;      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )      sum     +=     arr  [  i  ];      return     sum  ;      }      // Function to find two missing      // numbers in range [1 n]. This      // function assumes that size of      // array is n-2 and all array      // elements are distinct      function     findTwoMissingNumbers  (  arr       n  )      {      // Sum of 2 Missing Numbers      let     sum     =     (  n     *     (  n     +     1  ))     /     2     -         getSum  (  arr       n     -     2  );      // Find average of two elements      let     avg     =     (  sum     /     2  );      // Find sum of elements smaller      // than average (avg) and sum of      // elements greater than average (avg)      let     sumSmallerHalf     =     0        sumGreaterHalf     =     0  ;      for     (  let     i     =     0  ;     i      <     n     -     2  ;     i  ++  )      {      if     (  arr  [  i  ]      <=     avg  )      sumSmallerHalf     +=     arr  [  i  ];      else      sumGreaterHalf     +=     arr  [  i  ];      }      document  .  write  (      'Two Missing '     +     'Numbers are '     +     ' 
'
); // The first (smaller) element = // (sum of natural numbers upto // avg) - (sum of array elements // smaller than or equal to avg) let totalSmallerHalf = ( avg * ( avg + 1 )) / 2 ; document . write ( ( totalSmallerHalf - sumSmallerHalf ) + ' ' ); // The first (smaller) element = // (sum of natural numbers from // avg+1 to n) - (sum of array // elements greater than avg) document . write ( (( n * ( n + 1 )) / 2 - totalSmallerHalf ) - sumGreaterHalf + '
'
); } let arr = [ 1 3 5 6 ]; // Range of numbers is 2 // plus size of array let n = 2 + arr . length ; findTwoMissingNumbers ( arr n ); < /script>

Izvade
Two Missing Numbers are 2 4 

Piezīme. Iepriekš minētajā risinājumā var būt pārpildes problēmas. 

Zemāk 2. kopā tiek apspriests cits risinājums, kas ir O(n) laiks O(1) telpa un neizraisa pārplūdes problēmas.
Atrodiet divus trūkstošos skaitļus | 2. komplekts (risinājums, kura pamatā ir XOR)