logo

Skontrolujte, či je možné z daného poľa vytvoriť aritmetickú progresiu

Vyskúšajte to na GfG Practice ' title=

Vzhľadom na množstvo n celé čísla. Úlohou je skontrolovať, či je možné pomocou všetkých daných prvkov vytvoriť aritmetickú postupnosť. Ak je to možné, vytlačte „Áno“, inak vytlačte „Nie“.

Príklady:  

Vstup: arr[] = {0 12 4 8}
výstup: áno
Preusporiadajte dané pole ako {0 4 8 12}, ktoré tvorí aritmetickú postupnosť.

Vstup: arr[] = {12 40 11 20}
výstup: Nie



Použitie triedenia - O(n Log n) Čas

Cieľom je zoradiť dané pole. Po zoradení skontrolujte, či sú rozdiely medzi po sebe nasledujúcimi prvkami rovnaké alebo nie. Ak sú všetky rozdiely rovnaké, je možný aritmetický postup. Pozrite si prosím - Program na kontrolu aritmetického postupu na implementáciu tohto prístupu.

Použitie triedenia počítania - O(n) Čas a O(n) Priestor

Môžeme zmenšiť priestor potrebný v metóde 3, ak je možné dané pole upraviť. 

  1. Nájdite najmenší a druhý najmenší prvok.
  2. Nájdite d = druhý_najmenší - najmenší
  3. Odčítajte najmenší prvok od všetkých prvkov.
  4. Teraz, ak dané pole predstavuje AP, všetky prvky by mali mať tvar i*d, kde i sa mení od 0 do n-1.
  5. Jeden po druhom rozdeľte všetky redukované prvky s d. Ak niektorý prvok nie je deliteľný d, vráťte hodnotu false.
  6. Ak pole predstavuje AP, musí to byť permutácia čísel od 0 do n-1. Môžeme to ľahko skontrolovať pomocou triedenia počítania.

Nižšie je uvedená implementácia tejto metódy:

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. 

Výstup
Yes

Časová zložitosť - O(n) 
Pomocný priestor - O(n)

Hašovanie s jedným prechodom - O(n) čas a O(n) priestor

Základnou myšlienkou je nájsť spoločný rozdiel AP zistením maximálneho a minimálneho prvku poľa. Potom začnite od maximálnej hodnoty a pokračujte v znižovaní hodnoty o spoločný rozdiel spolu s kontrolou, či je táto nová hodnota prítomná v hashmape alebo nie. Ak v žiadnom bode hodnota nie je prítomná v hashsete, prerušte cyklus . Ideálna situácia po prerušení slučky je, že je pokrytých všetkých n prvkov a ak áno, vráti sa pravda, inak sa vráti nepravda. 

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)) 

Výstup
true
Vytvoriť kvíz