Бројање тројки са сумом мањом од дате вредности


Ниво тешкоће Средњи
Често питани у адобе амазонка јабука Блоомберг БитеДанце Цисцо Цитадела Цитрик ДоорДасх еБаи фацебоок Голдман Сакс гоогле Хулу ИБМ- Инфосис Матхворкс мицрософт пророчанство ПаиПал Куалтрицс самсунг СервицеНов Сплунк Квадрат Тенцент Тесла Убер виза ВМваре Валмарт Лабс иахоо Зохо
Акамаи Ред Гроупон Постматес Тво Поинтер Тво Поинтерс Воркс Апплицатионс

Изјава о проблему

Дали смо низ који садржи Н број елемената. У датој поредак, Избројите број тројки чија је сума мања од дате вредности.

Пример

Улазни

а [] = {1, 2, 3, 4, 5, 6, 7, 8}
Збир = 10

Излаз

7
Могуће тројке су: (1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,3,4), (1,3,5 ), (2,3,4)

Улазни

а [] = {3, 7, 9, 1, 2, 5, 11, 4}
Збир = 10

Излаз

6
Могуће тројке су: (3,1,2), (3,1,5), (3,1,4), (3,2,4), (1,2,5), (1,2,4 )

Приступ 1

Алгоритам

1. Покрените 3 угнежђене петље, бирајући све могуће тројке.

2. Иницијализовање резултата = 0.

3. Ако је Збир елемената мањи од Збир, рачунајте прираштај.

4. Испис резултата као броја тројки које задовољавају услов.

Имплементација

Ц ++ програм за бројање тројки са сумом мањом од дате вредности

#include <bits/stdc++.h>
using namespace std;
 
//Main function
int main()
{
    int array[] = {3, 7, 9, 1, 2, 5, 11, 4};
    int N = sizeof(array)/sizeof(array[0]);
    int sum = 10;
    int result = 0;
    //First for loop for selecting first element
    //Second loop for second element
    //Third loop for third element.
    //check for triplets satisfing the condition, and increment result
    for (int i = 0; i < N-2; i++)
    {
       for (int j = i+1; j < N-1; j++)
       {
           for (int k = j+1; k < N; k++)
           {
               if(array[i]+array[j]+array[k] < sum)
                   {
                      result++;
                   }
           }
       }
    }
    cout<<"Number of Triplets found = ";
    cout<<result;
    return 0;
}
Number of Triplets found = 6

Јава програм за бројање тројки са сумом мањом од дате вредности

import static java.lang.Math.pow;
import java.util.Scanner;
class sum
{
    public static void main(String[] args)  
    { 
        Scanner sr = new Scanner(System.in);
        int n = sr.nextInt();
        int sum = sr.nextInt();
        int a[] = new int[n];
        for(int i=0;i<n;i++)
        {
            a[i] = sr.nextInt();
        }
        //First for loop for selecting first element
        //Second loop for second element
        //Third loop for third element.
        //check for triplets satisfing the condition, and increment result
        int result=0;
        for (int i = 0; i < n-2; i++)
        {
           for (int j = i+1; j < n-1; j++)
           {
               for (int k = j+1; k < n; k++)
               {
                   if(a[i]+a[j]+a[k] < sum)
                       {
                          result++;
                       }
               }
           }
        }
        System.out.print("Number of Triplets found = ");
        System.out.println(result);
    }
}
5 6
1 2 3 2 1
Number of Triplets found = 5

Анализа сложености

Сложеност времена

О (н * н * н) где је н величина датог низа. Овде проверавамо да ли постоје све тројке и ако је услов тачан онда повећајте број резултата.

Сложеност простора

О (1) јер овде не користимо никакав помоћни простор.

Приступ 2

Алгоритам

1. Сортирај дати низ, иницијализуј резултат = 0

2. Итерирајте од и до Н -2 (Н је величина низа) и узмите низ [и] и први елемент триплета.

3. Иницијализујте друга два елемента као угловне елементе. низ [и + 1] и низ [Н-1]

4. померајте ј и к док се не састану да ураде,

  1. Ако је збир већи од датог збира, померите показивач на последњи елемент. (низ [Н-1]).
  2. Иначе ако је збир мањи од датог збира, тада може постојати к -ј могућих трећих елемената који задовољавају, па додајте (кј) у резултат. И померите показивач низа [и + 1].

Корак КСНУМКС: Испис резултата након завршетка петље.

Имплементација

Ц ++ програм за бројање тројки са сумом мањом од дате вредности

#include <bits/stdc++.h>
using namespace std;
 
// Main function
int main()
{
    int array[] ={1, 2,3,5,6, 3, 2, 5, 7};//input array
    int N = sizeof(array)/sizeof(array[0]);//size of the input array(N)
    int Sum = 9;//input Sum
    int result = 0;//initilizing count of triplets
    sort(array,array+N);//sorting the input array
    //selecting first element
    for(int i = 0; i < N - 2; i++)
    {
        int j=i+1,k=N-1;//second and third elements as last two elements
        while(j<k)
        {
            // Sum of triplet is greater than or equalto given sum, move to find smaller values
            if(array[i] + array[j] + array[k] >= Sum)
            {
                k--;
            }
            // Sum of triplet is less than given sum
            else
            {
                //for current i and j there can be k-j elements, move j pointer
                result += (k - j);
                j++;
            }
        }
    }
    cout<<"Number of Triplets found = ";
    cout<<result;
}
Number of Triplets found = 14

Јава програм за бројање тројки са сумом мањом од дате вредности

import static java.lang.Math.pow;
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 sum = sr.nextInt();
        int a[] = new int[n];
        for(int i=0;i<n;i++)
        {
            a[i] = sr.nextInt();
        }
        //First for loop for selecting first element
        //Second loop for second element
        //Third loop for third element.
        //check for triplets satisfing the condition, and increment result
        int result=0;
        Arrays. sort(a);//sorting the input array
        //selecting first element
        for(int i = 0; i < n - 2; i++)
        {
            int j=i+1,k=n-1;//second and third elements as last two elements
            while(j<k)
            {
                // Sum of triplet is greater than or equalto given sum, move to find smaller values
                if(a[i] + a[j] + a[k] >= sum)
                {
                    k--;
                }
                // Sum of triplet is less than given sum
                else
                {
                    //for current i and j there can be k-j elements, move j pointer
                    result += (k - j);
                    j++;
                }
            }
        }
        System.out.print("Number of Triplets found = ");
        System.out.println(result);
    }
}
9 9
1 2 3 5 6 3 2 5 7
Number of Triplets found = 14

Анализа сложености

Сложеност времена

О (н * н) где је н број елемената присутних у низу. Овде поправљамо један елемент триплета, а затим користимо две методе показивача које покрећу О (Н) у најгорем случају за један елемент.

Сложеност простора

О (1) јер овде не користимо никакав помоћни простор.

Референце