打印总和小于k的三胞胎

给定一个不同整数数组和一个和值。打印总和小于给定总和值的所有三元组。预期时间复杂度为O(n 2. ).

null

例子 :

Input : arr[] = {-2, 0, 1, 3}        sum = 2.Output : (-2, 0, 1)         (-2, 0, 3) Explanation :  The two triplets have sum less than 2.Input : arr[] = {5, 1, 3, 4, 7}        sum = 12.Output : (1, 3, 4)         (1, 3, 5)         (1, 3, 7)          (1, 4, 5)               

A. 简单解决方案 是运行三个循环来逐个考虑所有三元组。对于每个三元组,比较总和,如果其总和小于给定总和,则打印当前三元组。

C++

// A Simple C++ program to count triplets with sum
// smaller than a given value
#include<bits/stdc++.h>
using namespace std;
int printTriplets( int arr[], int n, int sum)
{
// Fix the first element as A[i]
for ( int i = 0; i < n-2; i++)
{
// Fix the second element as A[j]
for ( int j = i+1; j < n-1; j++)
{
// Now look for the third number
for ( int k = j+1; k < n; k++)
if (arr[i] + arr[j] + arr[k] < sum)
cout << arr[i] << ", " << arr[j]
<< ", " << arr[k] << endl;
}
}
}
// Driver program
int main()
{
int arr[] = {5, 1, 3, 4, 7};
int n = sizeof arr / sizeof arr[0];
int sum = 12;
printTriplets(arr, n, sum);
return 0;
}


JAVA

// A Simple Java program to
// count triplets with sum
// smaller than a given value
import java.io.*;
class GFG
{
static int printTriplets( int arr[],
int n, int sum)
{
// Fix the first
// element as A[i]
for ( int i = 0 ; i < n - 2 ; i++)
{
// Fix the second
// element as A[j]
for ( int j = i + 1 ;
j < n - 1 ; j++)
{
// Now look for
// the third number
for ( int k = j + 1 ; k < n; k++)
if (arr[i] + arr[j] + arr[k] < sum)
System.out.println(arr[i] + ", " +
arr[j] + ", " +
arr[k]);
}
}
return 0 ;
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 5 , 1 , 3 , 4 , 7 };
int n = arr.length;
int sum = 12 ;
printTriplets(arr, n, sum);
}
}
// This code is contributed
// by anuj_67.


Python3

# A Simple python 3 program to count
# triplets with sum smaller than a
# given value
def printTriplets(arr, n, sum ):
# Fix the first element as A[i]
for i in range ( 0 , n - 2 , 1 ):
# Fix the second element as A[j]
for j in range (i + 1 , n - 1 , 1 ):
# Now look for the third number
for k in range (j + 1 , n, 1 ):
if (arr[i] + arr[j] + arr[k] < sum ):
print (arr[i], "," , arr[j], "," , arr[k])
# Driver Code
if __name__ = = '__main__' :
arr = [ 5 , 1 , 3 , 4 , 7 ]
n = len (arr)
sum = 12
printTriplets(arr, n, sum )
# This code is contributed by
# Sahil_Shelangia


C#

// A Simple C# program to
// count triplets with sum
// smaller than a given value
using System;
class GFG
{
static int printTriplets( int [] arr,
int n, int sum)
{
// Fix the first
// element as A[i]
for ( int i = 0; i < n - 2; i++)
{
// Fix the second
// element as A[j]
for ( int j = i + 1;
j < n - 1; j++)
{
// Now look for
// the third number
for ( int k = j + 1; k < n; k++)
if (arr[i] + arr[j] + arr[k] < sum)
Console.WriteLine(arr[i] + ", " +
arr[j] + ", " +
arr[k]);
}
}
return 0;
}
// Driver Code
public static void Main ()
{
int [] arr = {5, 1, 3, 4, 7};
int n = arr.Length;
int sum = 12;
printTriplets(arr, n, sum);
}
}
// This code is contributed
// by Mukul Singh.


PHP

<?php
// A Simple PHP program to count triplets
// with sum smaller than a given value
function printTriplets(& $arr , $n , $sum )
{
// Fix the first element as A[i]
for ( $i = 0; $i < $n - 2; $i ++)
{
// Fix the second element as A[j]
for ( $j = $i + 1; $j < $n - 1; $j ++)
{
// Now look for the third number
for ( $k = $j + 1; $k < $n ; $k ++)
if ( $arr [ $i ] + $arr [ $j ] +
$arr [ $k ] < $sum )
{
echo ( $arr [ $i ]);
echo ( ", " );
echo ( $arr [ $j ]);
echo ( ", " );
echo ( $arr [ $k ]);
echo ( "" );
}
}
}
}
// Driver Code
$arr = array (5, 1, 3, 4, 7);
$n = sizeof( $arr );
$sum = 12;
printTriplets( $arr , $n , $sum );
// This code is contributed
// by Shivi_Aggarwal
?>


Javascript

<script>
// A Simple JavaScript program to
// count triplets with sum
// smaller than a given value
function printTriplets(arr, n, sum)
{
// Fix the first element as A[i]
for (let i = 0; i < n-2; i++)
{
// Fix the second element as A[j]
for (let j = i+1; j < n-1; j++)
{
// Now look for the third number
for (let k = j+1; k < n; k++)
if (arr[i] + arr[j] + arr[k] < sum)
document.write(arr[i] + ", " + arr[j]
+ ", " + arr[k] + "<br>" );
}
}
}
// Driver program
let arr = [5, 1, 3, 4, 7];
let n = arr.length;
let sum = 12;
printTriplets(arr, n, sum);
// This code is contributed by Surbhi Tyagi.
</script>


输出:

5, 1, 35, 1, 41, 3, 41, 3, 7

上述解的时间复杂度为O(n) 3. ).

有效解决方案 可以打印三胞胎吗 O(n) 2. ) 首先对数组进行排序,然后使用 在一个循环中发布。

1) Sort the input array in increasing order.2) Initialize result as 0.3) Run a loop from i = 0 to n-2.  An iteration of this loop    finds all triplets with arr[i] as first element.     a) Initialize other two elements as corner elements        of subarray        arr[i+1..n-1], i.e., j = i+1 and k = n-1     b) Move j and k toward each other until they meet,        i.e., while (j = sum), then do k--        // Else for current i and j, there are (k-j) possible          // third elements that satisfy the constraint.        (ii) Else print elements from j to k

下面是上述想法的实现。

C++

// C++ program to print triplets with sum smaller
// than a given value
#include <bits/stdc++.h>
using namespace std;
int printTriplets( int arr[], int n, int sum)
{
// Sort input array
sort(arr, arr + n);
// Every iteration of loop counts triplet with
// first element as arr[i].
for ( int i = 0; i < n - 2; i++) {
// Initialize other two elements as corner
// elements of subarray arr[j+1..k]
int j = i + 1, k = n - 1;
// Use Meet in the Middle concept
while (j < k) {
// If sum of current triplet is more or equal,
// move right corner to look for smaller values
if (arr[i] + arr[j] + arr[k] >= sum)
k--;
// Else move left corner
else {
// This is important. For current i and j,
// there are total k-j third elements.
for ( int x = j + 1; x <= k; x++)
cout << arr[i] << ", " << arr[j]
<< ", " << arr[x] << endl;
j++;
}
}
}
}
// Driver program
int main()
{
int arr[] = { 5, 1, 3, 4, 7 };
int n = sizeof arr / sizeof arr[0];
int sum = 12;
printTriplets(arr, n, sum);
return 0;
}


JAVA

// Java program to print
// triplets with sum smaller
// than a given value
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
{
static void printTriplets( int arr[],
int n, int sum)
{
// Sort input array
Arrays.sort(arr);
// Every iteration of loop
// counts triplet with
// first element as arr[i].
for ( int i = 0 ; i < n - 2 ; i++)
{
// Initialize other two elements
//  as corner elements of subarray
// arr[j+1..k]
int j = i + 1 , k = n - 1 ;
// Use Meet in the
// Middle concept
while (j < k)
{
// If sum of current triplet
// is more or equal, move right
// corner to look for smaller values
if (arr[i] + arr[j] + arr[k] >= sum)
k--;
// Else move left corner
else
{
// This is important. For
// current i and j, there
// are total k-j third elements.
for ( int x = j + 1 ; x <= k; x++)
System.out.println(arr[i] + ", " +
arr[j] + ", " +
arr[x]);
j++;
}
}
}
}
// Driver Code
public static void main(String args[])
{
int arr[] = { 5 , 1 , 3 , 4 , 7 };
int n = arr.length;
int sum = 12 ;
printTriplets(arr, n, sum);
}
}
// This code is contributed
// by Subhadeep


Python3

# Python3 program to print
# triplets with sum smaller
# than a given value
def printTriplets(arr, n, sum ):
# Sort input array
arr.sort()
# Every iteration of loop
# counts triplet with
# first element as arr[i].
for i in range (n - 2 ):
# Initialize other two elements
# as corner elements of subarray
# arr[j+1..k]
(j, k) = (i + 1 , n - 1 )
# Use Meet in the
# Middle concept
while (j < k):
# If sum of current triplet
# is more or equal, move right
# corner to look for smaller values
if (arr[i] + arr[j] + arr[k] > = sum ):
k - = 1
# Else move left corner
else :
# This is important. For
# current i and j, there
# are total k-j third elements.
for x in range (j + 1 , k + 1 ):
print ( str (arr[i]) + ", " +
str (arr[j]) + ", " +
str (arr[x]))
j + = 1
# Driver code
if __name__ = = "__main__" :
arr = [ 5 , 1 , 3 , 4 , 7 ]
n = len (arr)
sum = 12
printTriplets(arr, n, sum );
# This code is contributed by rutvik_56


C#

// C# program to print
// triplets with sum smaller
// than a given value
using System;
class GFG
{
static void printTriplets( int [] arr,
int n, int sum)
{
// Sort input array
Array.Sort(arr);
// Every iteration of loop
// counts triplet with
// first element as arr[i].
for ( int i = 0; i < n - 2; i++)
{
// Initialize other two elements
// as corner elements of subarray
// arr[j+1..k]
int j = i + 1, k = n - 1;
// Use Meet in the
// Middle concept
while (j < k)
{
// If sum of current triplet
// is more or equal, move right
// corner to look for smaller values
if (arr[i] + arr[j] + arr[k] >= sum)
k--;
// Else move left corner
else
{
// This is important. For
// current i and j, there
// are total k-j third elements.
for ( int x = j + 1; x <= k; x++)
Console.WriteLine(arr[i] + ", " +
arr[j] + ", " +
arr[x]);
j++;
}
}
}
}
// Driver Code
public static void Main()
{
int [] arr = { 5, 1, 3, 4, 7 };
int n = arr.Length;
int sum = 12;
printTriplets(arr, n, sum);
}
}
// This code is contributed
// by Akanksha Rai


PHP

<?php
// PHP program to print triplets with
// sum smaller than a given value
function printTriplets( $arr , $n , $sum )
{
// Sort input array
sort( $arr , 0);
// Every iteration of loop counts
// triplet with first element as arr[i].
for ( $i = 0; $i < $n - 2; $i ++)
{
// Initialize other two elements as corner
// elements of subarray arr[j+1..k]
$j = $i + 1; $k = $n - 1;
// Use Meet in the Middle concept
while ( $j < $k )
{
// If sum of current triplet is more
// or equal, move right corner to
// look for smaller values
if ( $arr [ $i ] + $arr [ $j ] +
$arr [ $k ] >= $sum )
$k --;
// Else move left corner
else
{
// This is important. For current i and j,
// there are total k-j third elements.
for ( $x = $j + 1; $x <= $k ; $x ++)
echo $arr [ $i ] . ", " . $arr [ $j ] .
", " . $arr [ $x ] . "" ;
$j ++;
}
}
}
}
// Driver Code
$arr = array (5, 1, 3, 4, 7);
$n = sizeof( $arr );
$sum = 12;
printTriplets( $arr , $n , $sum );
// This code is contributed
// by Akanksha Rai
?>


Javascript

<script>
// JavaScript program to print
// triplets with sum smaller
// than a given value
function printTriplets(arr, n, sum)
{
// Sort input array
arr.sort( function (a, b){ return a - b});
// Every iteration of loop
// counts triplet with
// first element as arr[i].
for (let i = 0; i < n - 2; i++)
{
// Initialize other two elements
// as corner elements of subarray
// arr[j+1..k]
let j = i + 1, k = n - 1;
// Use Meet in the
// Middle concept
while (j < k)
{
// If sum of current triplet
// is more or equal, move right
// corner to look for smaller values
if (arr[i] + arr[j] + arr[k] >= sum)
k--;
// Else move left corner
else
{
// This is important. For
// current i and j, there
// are total k-j third elements.
for (let x = j + 1; x <= k; x++)
document.write(arr[i] + ", " +
arr[j] + ", " +
arr[x] + "</br>" );
j++;
}
}
}
}
let arr = [ 5, 1, 3, 4, 7 ];
let n = arr.length;
let sum = 12;
printTriplets(arr, n, sum);
</script>


输出:

1, 3, 41, 3, 51, 3, 71, 4, 5

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享