Étant donné un tableau de n entiers uniques où chaque élément du tableau est compris dans la plage [1 n]. Le tableau contient tous les éléments distincts et la taille du tableau est (n-2). Par conséquent, deux nombres de la plage manquent dans ce tableau. Trouvez les deux nombres manquants.
Exemples :
Input : arr[] = {1 3 5 6} Output : 2 4 Input : arr[] = {1 2 4} Output : 3 5 Input : arr[] = {1 2} Output : 3 4 Méthode 1 - Complexité temporelle O(n) et O(n) Espace supplémentaire
Étape 1 : Prendre un tableau booléen marque qui garde une trace de tous les éléments présents dans le tableau.
Étape 2 : Parcourez de 1 à n, vérifiez pour chaque élément s'il est marqué comme vrai dans le tableau booléen, sinon affichez simplement cet élément.
// 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 aren'; 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(0n-21): mark[arr[i]] = True # Print two unmarked elements print('Two Missing Numbers are') for i in range(1n+11): if (mark[i] == False): print(iend = ' ') 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>
Sortir
Two Missing Numbers are 2 4
Méthode 2 - Complexité temporelle O(n) et O(1) Espace supplémentaire
L'idée est basée sur ce solution populaire pour trouver un numéro manquant. Nous étendons la solution pour que deux éléments manquants soient imprimés.
Découvrons la somme de 2 nombres manquants :
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;
- L'un des nombres sera inférieur ou égal à moyenne tandis que l’autre sera strictement supérieur à moyenne . Deux nombres ne peuvent jamais être égaux puisque tous les nombres donnés sont distincts.
- Nous pouvons trouver le premier nombre manquant comme une somme de nombres naturels de 1 à moyenne c'est-à-dire moyenne*(moy+1)/2 moins la somme des éléments du tableau plus petite que moyenne
- Nous pouvons trouver le deuxième nombre manquant en soustrayant le premier nombre manquant de la somme des nombres manquants
Prenons un exemple pour une meilleure clarification
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
Vous trouverez ci-dessous la mise en œuvre de l’idée ci-dessus.
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 aren'; // 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(arrn): 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 aren'; // 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>
Sortir
Two Missing Numbers are 2 4
Remarque : Il peut y avoir des problèmes de débordement dans la solution ci-dessus.
Dans l'ensemble 2 ci-dessous, une autre solution qui est un espace O(n) temps O(1) et ne provoque pas de problèmes de débordement est discutée.
Trouver deux numéros manquants | Ensemble 2 (solution basée sur XOR)