Подсчитайте количество пар (i, j) таких, что arr [i] * arr [j]> arr [i] + arr [j]

Опубликовано: 5 Января, 2022

Для массива arr [] неотрицательных целых чисел задача состоит в том, чтобы подсчитать пары индексов (i, j, такие, что arr [i] * arr [j]> arr [i] + arr [j], где i <j .

Примеры:

Input: arr[] = { 5, 0, 3, 1, 2 }
Output: 3

Input: arr[] = { 1, 1, 1 }
Output: 0

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Наивный подход: запустите два вложенных цикла и проверьте для каждой пары, выполняется ли условие. Если условие выполняется для какой-либо пары, обновите count = count + 1 и напечатайте счет в конце.

Ниже представлена реализация описанного выше подхода:

C ++

// C++ program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
#include <bits/stdc++.h>
using namespace std;
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
long countPairs( int arr[], int n)
{
long count = 0;
for ( int i = 0; i < n - 1; i++) {
for ( int j = i + 1; j < n; j++) {
// If condition is satisfied
if (arr[i] * arr[j] > arr[i] + arr[j])
count++;
}
}
count; return
}
// Driver code
int main()
{
int arr[] = { 5, 0, 3, 1, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << countPairs(arr, n);
return 0;
}

Джава

// Java program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
import java.util.*;
class solution
{
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
static long countPairs( int arr[], int n)
{
long count = 0 ;
for ( int i = 0 ; i < n - 1 ; i++) {
for ( int j = i + 1 ; j < n; j++) {
// If condition is satisfied
if (arr[i] * arr[j] > arr[i] + arr[j])
count++;
}
}
count; return
}
// Driver code
public static void main(String args[])
{
int arr[] = { 5 , 0 , 3 , 1 , 2 };
int n = arr.length;
System.out.println(countPairs(arr, n));
}
}
// This code is contributed by
// Surendra_Gangwar

Python3

# Python3 program to count pairs(i,j)
# such that arr[i]*arr[j]>arr[i]+arr[j]
import math as mt
# function to return the count of pairs
# such that arr[i]*arr[j]>arr[i]+arr[j]
def countPairs(arr, n):
count = 0
for i in range (n):
for j in range (i + 1 , n):
# if condition is satisified
if arr[i] * arr[j] > arr[i] + arr[j]:
count + = 1
count return
# Driver code
arr = [ 5 , 0 , 3 , 1 , 2 ]
n = len (arr)
print (countPairs(arr, n))
# This code is contributed
# by Mohit Kumar 29

C #

// C# program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
using System;
public class GFG{
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
static long countPairs( int []arr, int n)
{
long count = 0;
for ( int i = 0; i < n - 1; i++) {
for ( int j = i + 1; j < n; j++) {
// If condition is satisfied
if (arr[i] * arr[j] > arr[i] + arr[j])
count++;
}
}
count; return
}
// Driver code
static public void Main (){
int []arr = { 5, 0, 3, 1, 2 };
int n = arr.Length;
Console.WriteLine (countPairs(arr, n));
}
}

PHP

<?php
// PHP program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
function countPairs( $arr , $n )
{
$count = 0;
for ( $i = 0; $i < $n - 1; $i ++)
{
for ( $j = $i + 1; $j < $n ; $j ++)
{
// If condition is satisfied
if ( $arr [ $i ] *
$arr [ $j ] > $arr [ $i ] +
$arr [ $j ])
$count ++;
}
}
return $count ;
}
// Driver code
$arr = array ( 5, 0, 3, 1, 2 );
$n = sizeof( $arr ) ;
echo countPairs( $arr , $n );
// This code is contributed by Ryuga
?>
Выход:
3

Эффективный подход: рассмотрим следующие случаи:

1) arr[i] = 0 or arr[i] = 1 and arr[j] = any element
In this case, arr[j] * arr[i] will always be less than arr[i] + arr[j].
Hence we can discard all pairs which have one element either 0 or 1.

2) arr[i] = 2 and arr[j] <= 2
In this case, arr[j] * arr[i] will always be less than or equal to arr[i] + arr[j].
Hence again we can discard all such pairs.

3) arr[i] = 2 and arr[j] > 2
This case will produce valid pairs. If count_2 is the count of ‘2’s and count_others
is the count of elements greater than 2,
then number of pairs will be count_2 * count_others.

4) arr[i] > 2 and arr[j] > 2
This case will also produce valid pairs. Let count_others be the number of elements
greater than 2, then every two elements among these count_others elements
will form a valid pair. Hence the number of pairs will be

Therefore, total count = (count_2 * count_others) + (count_others * (count_others – 1)) / 2.

Ниже представлена реализация описанного выше подхода:

C ++

// C++ program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
#include <bits/stdc++.h>
using namespace std;
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
long countPairs( const int * arr, int n)
{
int count_2 = 0, count_others = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] == 2)
count_2++;
else if (arr[i] > 2)
count_others++;
}
long ans
= 1L * count_2 * count_others
+ (1L * count_others * (count_others - 1)) / 2;
return ans;
}
// Driver code
int main()
{
int arr[] = { 5, 0, 3, 1, 2 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << countPairs(arr, n);
return 0;
}

Джава

// Java program to count pairs (i, j)
// such that arr[i] * arr[j] > arr[i] + arr[j]
class GFG
{
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
static long countPairs( int [] arr, int n)
{
int count_2 = 0 , count_others = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] == 2 )
{
count_2++;
}
else if (arr[i] > 2 )
{
count_others++;
}
}
long ans = 1L * count_2 * count_others +
(1L * count_others * (count_others - 1 )) / 2 ;
return ans;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 5 , 0 , 3 , 1 , 2 };
int n = arr.length;
System.out.println(countPairs(arr, n));
}
}
// This code is contributed by
// 29AjayKumar

Python3

# Python3 program to count pairs(i,j)
# such that arr[i]*arr[j]>arr[i]+arr[j]
import math as mt
# function to return the count of pairs
# such that arr[i]*arr[j]>arr[i]+arr[j]
def countPairs(arr, n):
count_2, count_others = 0 , 0
for i in range (n):
if arr[i] = = 2 :
count_2 + = 1
elif arr[i] > 2 :
count_others + = 1
ans = (count_2 * count_others +
(count_others *
(count_others - 1 )) / / 2 )
return ans
# Driver code
arr = [ 5 , 0 , 3 , 1 , 2 ]
n = len (arr)
print (countPairs(arr, n))
# This code is contributed
# by Mohit Kumar

C #

// C# program to count pairs (i, j) such
// that arr[i] * arr[j] > arr[i] + arr[j]
using System;
class GFG
{
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
static long countPairs( int [] arr, int n)
{
int count_2 = 0, count_others = 0;
for ( int i = 0; i < n; i++)
{
if (arr[i] == 2)
{
count_2++;
}
else if (arr[i] > 2)
{
count_others++;
}
}
long ans = 1L * count_2 * count_others +
(1L * count_others *
(count_others - 1)) / 2;
return ans;
}
// Driver code
public static void Main()
{
int [] arr = {5, 0, 3, 1, 2};
int n = arr.Length;
Console.WriteLine(countPairs(arr, n));
}
}
// This code is contributed by
// Mukul Singh

PHP

<?php
// PHP program to count pairs (i, j) such
// that arr[i] * arr[j] > arr[i] + arr[j]
// Function to return the count of pairs
// such that arr[i] * arr[j] > arr[i] + arr[j]
function countPairs( $arr , $n )
{
$count_2 = 0; $count_others = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] == 2)
$count_2 ++;
else if ( $arr [ $i ] > 2)
$count_others ++;
}
$ans = $count_2 * $count_others +
( $count_others *
( $count_others - 1)) / 2;
return $ans ;
}
// Driver code
$arr = array ( 5, 0, 3, 1, 2 );
$n = sizeof( $arr );
echo countPairs( $arr , $n );
// This code is contributed
// by Akanksha Rai
?>
Выход:
3

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.