Verilən cəm ilə Arrayda üçlü tapın

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Akkolit Çiy kərpic Amazon alma Bloomberg ByteDance Cisco Citadel Citrix Qapılar eBay Facebook Goldman Sachs google Hulu IBM Infosys Riyaziyyat microsoft Morgan Stanley Kahin PayPal Kvalifikasiya Samsung XidmətNow Boşalmaq kvadrat Tencent Tesla Über Viza VMware Walmart Laboratoriyaları Yahoo Zoho
Akamai Geyim CarWale Groupon Postmates ProqramlarBaxılıb 868

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

Bir sıra tam ədədi nəzərə alsaq, üç elementin birləşməsini tapın array cəmi verilmiş bir X-ə bərabərdir. Burada əldə etdiyimiz ilk kombinasiyanı çap edəcəyik. Əgər belə bir birləşmə yoxdursa, onda -1 yazdırın.

misal

Input

N = 5, X = 15

arr [] = {10, 4, 2, 3, 5}

Buraxılış 

10, 2, 3

Yanaşma 1

Bütün üçəmlərin yaradılması və cəmi verilən dəyərə müqayisə etmək. Aşağıdakı alqoritm üç döngədən ibarətdir.

Alqoritm

  1. Əvvəlcə giriş sırasını sıralayın
  2. Birinci elementi i [0] ilə N-2 arasında dəyişən arr [i] olaraq düzəldin.
  3. Birinci elementi düzəltdikdən sonra j elementinin i + 1-dən N-1-ə qədər olduğu ikinci elementi arr [j] kimi düzəldin.
  4. İkinci elementi düzəltdikdən sonra üçüncü elementi k + j + 1-dən N-ə qədər olan arr [k] kimi düzəldin.
  5. Cəmi tapın, arr [i] + arr [j] + arr [k].
  6. Üçlü cəm X dəyərinə bərabərdirsə, qalan üç elementi çap edin -1.

Həyata keçirilməsi

Verilən cəm ilə Arrayda üçlü tapmaq üçün C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int N,X;//size of the array
    cin>>N>>X;
    int arr[N];
    for(int i=0;i<N;i++)
    {
        cin>>arr[i];
    }
    for(int i=0;i<N;i++)
    {
        for(int j=i+1;j<N;j++)
        {
            for(int k=j+1;k<N;k++)
            {
                if( arr[i] + arr[j] + arr[k] == X)
                {
                   cout << arr[i] <<"  "<<arr[j]<<"  "<<arr[k];
                   return 1;
                }
            }
        }
    }
    cout<<-1<<endl;
    return 0;
}

Verilən cəmi ilə Arrayda Üçlüyü tapmaq üçün Java Proqramı

import java.util.Scanner;
class sum
{
    public static void main(String[] args)  
    { 
        Scanner sr = new Scanner(System.in);
        int n = sr.nextInt();
        int x = sr.nextInt();
        int a[] = new int[n];
        for(int i=0;i<n;i++)
        {
            a[i] = sr.nextInt();
        }
        int temp=0;
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                for(int k=j+1;k<n;k++)
                {
                    if( a[i] + a[j] + a[k] == x)
                    {
                       System.out.println(a[i]+"  "+a[j]+"  "+a[k]);
                       i=n;j=n;k=n;
                       temp=1;
                    }
                }
            }
        }
        if(temp==0)
        System.out.println(-1);
    }
}
5 15
10 4 2 3 5
10  2  3

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (n * n * n) hara n massivdə mövcud elementlərin sayıdır. Burada loop üçün üç Ron və mümkün olan üçlüyü yoxlayırıq.

Kosmik Mürəkkəblik

O (1) çünki burada heç bir köməkçi yerdən istifadə etmirik.

Yanaşma 2

Alqoritm

  1. ilk cür giriş massivi
  2. Birinci elementi i [0] ilə N-2 arasında dəyişən arr [i] olaraq düzəldin.
  3. Birinci element düzəldildikdən sonra növbəti iki elementi tapmaq üçün iki göstəriciyə bənzər dəyişənləri (j = i + 1, k = N-1) götürün və çeşidlənmiş massivdə cəmi tapmaq üçün alqoritmi keçin.
  4. J k-dən az olduqda, verilən indekslərə elementləri əlavə edin, yəni arr [i] + arr [j] + arr [k], üçlü cəm X dəyərinə bərabərdirsə, üçlü cəmdən az olduqda, başqa üç elementi çap edin. X dəyəri, daha sonra j dəyərini artırın, əksinə k dəyərini azaldır.

Həyata keçirilməsi

Verilən cəm ilə Arrayda üçlü tapmaq üçün C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int N,X;//size of the array
    cin>>N>>X;
    int arr[N];
    for(int i=0;i<N;i++)
    {
        cin>>arr[i];
    }
    sort(arr,arr+N); //sort the array in ascending order
    int computed_sum;//sum computed at each step
  
    for(int i = 0; i < N - 2; i++) // fix one element and search for other two elements in linear time
    {
      int j = i+1 , k = N-1; // jth index starts from the next element of selected and k always starts at the ending index
      
      while(j < k)
      {
        computed_sum = arr[i] + arr[j] + arr[k]; // add the elements at the given indices
        
        if(computed_sum == X)
          {
            cout << arr[i] <<"  "<<arr[j]<<"  "<<arr[k];
            return 1;
          }
        else if(computed_sum < X) // means we need to increase some element but as i is fixed and k is already higher than i and j. We increment jth index
          j++;
          
        else if(computed_sum > X)//means we need to decrease some element but as i is fixed and j is already smaller than kth index element , we decrement k
          k--;
      }
    }
  cout<<-1<<endl;
    return 0;
}

Verilən cəmi ilə Arrayda Üçlüyü tapmaq üçün Java Proqramı

import java.util.Arrays;
import java.util.Scanner;
class sum
{
    public static void main(String[] args)  
    { 
        Scanner sr = new Scanner(System.in);
        int n = sr.nextInt();
        int x = sr.nextInt();
        int a[] = new int[n];
        for(int i=0;i<n;i++)
        {
            a[i] = sr.nextInt();
        }
        Arrays.sort(a); //sort the array in ascending order
        int computed_sum;//sum computed at each step
        int temp=0;
        for(int i = 0; i < n - 2; i++) // fix one element and search for other two elements in linear time
        {
          int j = i+1 , k = n-1; // jth index starts from the next element of selected and k always starts at the ending index
          while(j < k)
          {
            computed_sum = a[i] + a[j] + a[k]; // add the elements at the given indices
            if(computed_sum == x)
              {
                System.out.println(a[i]+"  "+a[j]+"  "+a[k]);
                j=k;
                temp=1;
              }
            else if(computed_sum < x) // means we need to increase some element but as i is fixed and k is already higher than i and j. We increment jth index
              j++;
            else if(computed_sum > x)//means we need to decrease some element but as i is fixed and j is already smaller than kth index element , we decrement k
              k--;
          }
        }
        if(temp==0)
        System.out.println(-1);
    }
}
5 15
1 4 2 3 5
-1

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (n * n * n) hara n massivdə mövcud elementlərin sayıdır. Burada loop üçün üç Ron və mümkün olan üçlüyü yoxlayırıq.

Kosmik Mürəkkəblik

O (1) çünki burada heç bir köməkçi yerdən istifadə etmirik.

References

Crack Sistemi Dizayn Müsahibələri
Translate »