Donada una matriu de n nombres enters. La tasca consisteix a comprovar si es pot formar una progressió aritmètica utilitzant tots els elements donats. Si és possible, escriviu "Sí", sinó imprimiu "No".
taula en reacció
Exemples:
Entrada: arr[] = {0 12 4 8}
Sortida: Sí
Reorganitza la matriu donada com a {0 4 8 12} que forma una progressió aritmètica.
Entrada: arr[] = {12 40 11 20}
Sortida: No
Ús de l'Ordenació - O(n Log n) Temps
La idea és ordenar la matriu donada. Després d'ordenar, comproveu si les diferències entre els elements consecutius són iguals o no. Si totes les diferències són iguals, la progressió aritmètica és possible. Si us plau, consulteu - Programa per comprovar la progressió aritmètica per a la implementació d'aquest enfocament.
Utilitzant l'ordenació de recompte - O (n) Temps i O (n) Espai
Podem reduir l'espai necessari al mètode 3 si es pot modificar la matriu donada.
- Troba els elements més petits i els segons més petits.
- Trobeu d = segon_més petit - més petit
- Resta l'element més petit de tots els elements.
- Ara, si la matriu donada representa AP, tots els elements haurien de tenir la forma i*d on i varia de 0 a n-1.
- Un per un divideix tots els elements reduïts amb d. Si algun element no és divisible per d retorna fals.
- Ara, si la matriu representa AP, ha de ser una permutació de nombres de 0 a n-1. Ho podem comprovar fàcilment mitjançant l'ordenació de recompte.
A continuació es mostra la implementació d'aquest mètode:
C++// C++ program to check if a given array // can form arithmetic progression #include using namespace std; // Checking if array is permutation // of 0 to n-1 using counting sort bool countingsort(int arr[] int n) { int count[n] = { 0 }; // Counting the frequency for (int i = 0; i < n; i++) { count[arr[i]]++; } // Check if each frequency is 1 only for (int i = 0; i <= n-1; i++) { if (count[i] != 1) return false; } return true; } // Returns true if a permutation of arr[0..n-1] // can form arithmetic progression bool checkIsAP(int arr[] int n) { int smallest = INT_MAX second_smallest = INT_MAX; for (int i = 0; i < n; i++) { // Find the smallest and // update second smallest if (arr[i] < smallest) { second_smallest = smallest; smallest = arr[i]; } // Find second smallest else if (arr[i] != smallest && arr[i] < second_smallest) second_smallest = arr[i]; } // Find the difference between smallest and second // smallest int diff = second_smallest - smallest; for (int i = 0; i < n; i++) { arr[i]=arr[i]-smallest; } for(int i=0;i<n;i++) { if(arr[i]%diff!=0) { return false; } else { arr[i]=arr[i]/diff; } } // If array represents AP it must be a // permutation of numbers from 0 to n-1. // Check this using counting sort. if(countingsort(arrn)) return true; else return false; } // Driven Program int main() { int arr[] = { 20 15 5 0 10 }; int n = sizeof(arr) / sizeof(arr[0]); (checkIsAP(arr n)) ? (cout << 'Yes' << endl) : (cout << 'No' << endl); return 0; // This code is contributed by Pushpesh Raj }
Java // Java program to check if a given array // can form arithmetic progression import java.io.*; class GFG { // Checking if array is permutation // of 0 to n-1 using counting sort static boolean countingsort(int arr[] int n) { int[] count = new int[n]; for(int i = 0; i < n; i++) count[i] = 0; // Counting the frequency for (int i = 0; i < n; i++) { count[arr[i]]++; } // Check if each frequency is 1 only for (int i = 0; i <= n-1; i++) { if (count[i] != 1) return false; } return true; } // Returns true if a permutation of arr[0..n-1] // can form arithmetic progression static boolean checkIsAP(int arr[] int n) { int smallest = Integer.MAX_VALUE second_smallest = Integer.MAX_VALUE ; for (int i = 0; i < n; i++) { // Find the smallest and // update second smallest if (arr[i] < smallest) { second_smallest = smallest; smallest = arr[i]; } // Find second smallest else if (arr[i] != smallest && arr[i] < second_smallest) second_smallest = arr[i]; } // Find the difference between smallest and second // smallest int diff = second_smallest - smallest; for (int i = 0; i < n; i++) { arr[i] = arr[i] - smallest; } for(int i = 0; i < n; i++) { if(arr[i] % diff != 0) { return false; } else { arr[i] = arr[i]/diff; } } // If array represents AP it must be a // permutation of numbers from 0 to n-1. // Check this using counting sort. if(countingsort(arrn)) return true; else return false; } // Driven Program public static void main (String[] args) { int arr[] = { 20 15 5 0 10 }; int n = arr.length; if(checkIsAP(arr n)) System.out.println('Yes'); else System.out.println('No'); } } // This code is contributed by Utkarsh
Python # Python program to check if a given array # can form arithmetic progression import sys # Checking if array is permutation # of 0 to n-1 using counting sort def countingsort( arr n): count = [0]*n; # Counting the frequency for i in range(0 n): count[arr[i]] += 1; # Check if each frequency is 1 only for i in range(0 n - 1): if (count[i] != 1): return False; return True; # Returns true if a permutation of arr[0..n-1] # can form arithmetic progression def checkIsAP( arr n): smallest = sys.maxsize; second_smallest = sys.maxsize; for i in range(0n): # Find the smallest and # update second smallest if (arr[i] < smallest) : second_smallest = smallest; smallest = arr[i]; # Find second smallest elif (arr[i] != smallest and arr[i] < second_smallest): second_smallest = arr[i]; # Find the difference between smallest and second # smallest diff = second_smallest - smallest; for i in range(0n): arr[i]=arr[i]-smallest; for i in range(0n): if(arr[i]%diff!=0): return False; else: arr[i]=(int)(arr[i]/diff); # If array represents AP it must be a # permutation of numbers from 0 to n-1. # Check this using counting sort. if(countingsort(arrn)): return True; else: return False; # Driven Program arr = [ 20 15 5 0 10 ]; n = len(arr); if(checkIsAP(arr n)): print('Yes'); else: print('NO'); # This code is contributed by ratiagrawal.
C# using System; class GFG { // Checking if array is permutation // of 0 to n-1 using counting sort static bool CountingSort(int[] arr int n) { // Counting the frequency int[] count = new int[n]; for (int i = 0; i < n; i++) { count[arr[i]]++; } // Check if each frequency is 1 only for (int i = 0; i <= n - 1; i++) { if (count[i] != 1) { return false; } } return true; }// Returns true if a permutation of arr[0..n-1] // can form arithmetic progression static bool CheckIsAP(int[] arr int n) {// Find the smallest and // update second smallest int smallest = int.MaxValue; int secondSmallest = int.MaxValue; for (int i = 0; i < n; i++) { if (arr[i] < smallest) { secondSmallest = smallest; smallest = arr[i]; } else if (arr[i] != smallest && arr[i] < secondSmallest) { secondSmallest = arr[i]; } } int diff = secondSmallest - smallest; for (int i = 0; i < n; i++) { arr[i] = arr[i] - smallest; } for (int i = 0; i < n; i++) { if (arr[i] % diff != 0) { return false; } else { arr[i] = arr[i] / diff; } } // If array represents AP it must be a // permutation of numbers from 0 to n-1. // Check this using counting sort. if (CountingSort(arr n)) { return true; } else { return false; } } // Driven Program static void Main(string[] args) { int[] arr = new int[] { 20 15 5 0 10 }; int n = arr.Length; Console.WriteLine(CheckIsAP(arr n) ? 'Yes' : 'No'); } }
JavaScript // Javascript program to check if a given array // can form arithmetic progression // Checking if array is permutation // of 0 to n-1 using counting sort function countingsort( arr n) { let count=new Array(n).fill(0); // Counting the frequency for (let i = 0; i < n; i++) { count[arr[i]]++; } // Check if each frequency is 1 only for (let i = 0; i <= n-1; i++) { if (count[i] != 1) return false; } return true; } // Returns true if a permutation of arr[0..n-1] // can form arithmetic progression function checkIsAP( arr n) { let smallest = Number.MAX_SAFE_INTEGER second_smallest = Number.MAX_SAFE_INTEGER; for (let i = 0; i < n; i++) { // Find the smallest and // update second smallest if (arr[i] < smallest) { second_smallest = smallest; smallest = arr[i]; } // Find second smallest else if (arr[i] != smallest && arr[i] < second_smallest) second_smallest = arr[i]; } // Find the difference between smallest and second // smallest let diff = second_smallest - smallest; for (let i = 0; i < n; i++) { arr[i]=arr[i]-smallest; } for(let i=0;i<n;i++) { if(arr[i]%diff!=0) { return false; } else { arr[i]=arr[i]/diff; } } // If array represents AP it must be a // permutation of numbers from 0 to n-1. // Check this using counting sort. if(countingsort(arrn)) return true; else return false; } // Driven Program let arr = [20 15 5 0 10 ]; let n = arr.length; (checkIsAP(arr n)) ? (console.log('Yesn')) : (console.log('Non')); // // This code was contributed by poojaagrawal2.
Sortida
Yes
Complexitat temporal - O(n)
Espai auxiliar - O(n)
Hashing amb una sola passada: O(n) Temps i O(n) Espai
La idea bàsica és trobar la diferència comuna de l'AP esbrinant l'element màxim i mínim de la matriu. Després d'això, comenceu des del valor màxim i continueu disminuint el valor per la diferència comuna al costat de comprovar si aquest nou valor està present al mapa hash o no. Si en algun moment el valor no està present a l'hashset, trenca el bucle. La situació ideal després de la ruptura del bucle és que tots els n elements s'han cobert i, en cas afirmatiu, retornar true o fals.
C++// C++ program for above approach #include using namespace std; bool checkIsAP(int arr[] int n) { unordered_set<int> st; int maxi = INT_MIN; int mini = INT_MAX; for (int i=0;i<n;i++) { maxi = max(arr[i] maxi); mini = min(arr[i] mini); st.insert(arr[i]); } // FINDING THE COMMON DIFFERENCE int diff = (maxi - mini) / (n - 1); int count = 0; // CHECK TERMS OF AP PRESENT IN THE HASHSET while (st.find(maxi)!=st.end()) { count++; maxi = maxi - diff; } if (count == n) return true; return false; } // Driver Code int main() { int arr[] = { 0 12 4 8 }; int n = 4; cout << boolalpha << checkIsAP(arr n); return 0; } // This code is contributed by Rohit Pradhan
Java /*package whatever //do not write package name here */ import java.io.*; import java.util.*; class GFG { public static void main(String[] args) { int[] arr = { 0 12 4 8 }; int n = arr.length; System.out.println(checkIsAP(arr n)); } static boolean checkIsAP(int arr[] int n) { HashSet<Integer> set = new HashSet<Integer>(); int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for (int i : arr) { max = Math.max(i max); min = Math.min(i min); set.add(i); } // FINDING THE COMMON DIFFERENCE int diff = (max - min) / (n - 1); int count = 0; // CHECK IF TERMS OF AP PRESENT IN THE HASHSET while (set.contains(max)) { count++; max = max - diff; } if (count == arr.length) return true; return false; } }
Python import sys def checkIsAP(arr n): Set = set() Max = -sys.maxsize - 1 Min = sys.maxsize for i in arr: Max = max(i Max) Min = min(i Min) Set.add(i) # FINDING THE COMMON DIFFERENCE diff = (Max - Min) // (n - 1) count = 0 # CHECK IF TERMS OF AP PRESENT IN THE HASHSET while (Max in Set): count += 1 Max = Max - diff if (count == len(arr)): return True return False # driver code arr = [ 0 12 4 8 ] n = len(arr) print(checkIsAP(arr n)) # This code is contributed by shinjanpatra
C# using System; using System.Collections.Generic; public class GFG { // C# program for above approach static bool checkIsAP(int[] arr int n) { HashSet<int> st = new HashSet<int>(); int maxi = int.MinValue; int mini = int.MaxValue; for (int i = 0; i < n; i++) { maxi = Math.Max(arr[i] maxi); mini = Math.Min(arr[i] mini); st.Add(arr[i]); } // FINDING THE COMMON DIFFERENCE int diff = (maxi - mini) / (n - 1); int count = 0; // CHECK IF TERMS OF AP PRESENT IN THE HASHSET while (st.Contains(maxi)) { count++; maxi = maxi - diff; } if (count == n) { return true; } return false; } // Driver Code internal static void Main() { int[] arr = { 0 12 4 8 }; int n = 4; Console.Write(checkIsAP(arr n)); } // This code is contributed by Aarti_Rathi }
JavaScript function checkIsAP(arr n){ set = new Set() let Max = Number.MIN_VALUE let Min = Number.MAX_VALUE for(let i of arr){ Max = Math.max(i Max) Min = Math.min(i Min) set.add(i) } // FINDING THE COMMON DIFFERENCE let diff = Math.floor((Max - Min) / (n - 1)) let count = 0 // CHECK IF TERMS OF AP PRESENT IN THE HASHSET while (set.has(Max)){ count += 1 Max = Max - diff } if (count == arr.length) return true return false } // driver code let arr = [ 0 12 4 8 ] let n = arr.length console.log(checkIsAP(arr n))
Sortida
trueCrea un qüestionari