Posible formar un triángulo a partir de valores de array

Dada una array de enteros, necesitamos averiguar si es posible construir al menos un triángulo no degenerado utilizando valores de array como sus lados. En otras palabras, necesitamos encontrar 3 índices de array de este tipo que puedan convertirse en lados de un triángulo no degenerado. 

Ejemplos: 

Input : [4, 1, 2]
Output : No 
No triangle is possible from given
array values

Input : [5, 4, 3, 1, 2]
Output : Yes
Sides of possible triangle are 2 3 4

Para un triángulo no degenerado, sus lados deben seguir estas restricciones, 

A + B > C    and     
B + C > A    and
C + A > B
where A, B and C are length of sides of the triangle.

La tarea es encontrar cualquier triplete de la array que satisfaga la condición anterior.

Una solución simple es generar todos los tripletes y, para cada triplete, verificar si forma un triángulo o no al verificar las tres condiciones anteriores.

Una solución eficiente es la clasificación por uso. Primero, ordenamos la array, luego hacemos un bucle una vez y verificaremos tres elementos consecutivos de esta array si algún triplete satisface arr[i] + arr[i+1] > arr[i+2], luego mostraremos ese triplete como nuestro resultado final.

¿Por qué verificar solo 3 elementos consecutivos funcionará en lugar de probar todos los tripletes posibles de una array ordenada?  
Supongamos que estamos en el índice i y 3 segmentos de línea son arr[i], arr[i + 1] y arr[i + 2] con relación arr[i] < arr[i+1] < arr[i+2], Si no pueden formar un triángulo no degenerado, segmentos de línea de longitudes arr[i-1], arr[i+1] y arr[i+2] o arr[i], arr[i+1] y arr [i+3] no puede formar un triángulo no degenerado porque la suma de arr[i-1] y arr[i+1] será incluso menor que la suma de arr[i] y arr[i+1] en primer caso y la suma de arr[i] y arr[i+1] debe ser menor que arr[i+3] en el segundo caso, así que no necesitamos probar todas las combinaciones, probaremos solo 3 índices consecutivos de array en forma ordenada. 

La complejidad total de la siguiente solución es O(n log n)

Implementación:

C++

// C++ program to find if it is possible to form a triangle
// from array values
#include <bits/stdc++.h>
using namespace std;
 
// Method prints possible triangle when array values are
// taken as sides
bool isPossibleTriangle(int arr[], int N)
{
    // If number of elements are less than 3, then no
    // triangle is possible
    if (N < 3)
        return false;
    // first sort the array
    sort(arr, arr + N);
    // loop for all 3 consecutive triplets
    for (int i = 0; i < N - 2; i++)
        // If triplet satisfies triangle condition, break
        if (arr[i] + arr[i + 1] > arr[i + 2])
            return true;
    return false;
}
 
// Driver Code
int main()
{
    int arr[] = { 5, 4, 3, 1, 2 };
    int N = sizeof(arr) / sizeof(int);
 
    isPossibleTriangle(arr, N) ? cout << "Yes" : cout << "No";
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

C

// C program to find if it is possible to form a triangle
// from array values
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
 
int cmpfunc(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}
 
// Method prints possible triangle when array values are
// taken as sides
bool isPossibleTriangle(int arr[], int N)
{
    // If number of elements are less than 3, then no
    // triangle is possible
    if (N < 3)
        return false;
    // first sort the array
    qsort(arr, N, sizeof(int), cmpfunc);
    // loop for all 3 consecutive triplets
    for (int i = 0; i < N - 2; i++)
        // If triplet satisfies triangle condition, break
        if (arr[i] + arr[i + 1] > arr[i + 2])
            return true;
    return false;
}
 
// Driver Code
int main()
{
    int arr[] = { 5, 4, 3, 1, 2 };
    int N = sizeof(arr) / sizeof(int);
 
    isPossibleTriangle(arr, N) ? printf("Yes") : printf("No");
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

JAVA

// Java program to find if it is  possible to form a
// triangle  from array values
import java.io.*;
import java.util.Arrays;
 
class GFG {
 
    // Method prints possible triangle when array values are
    // taken as sides
    static boolean isPossibleTriangle(int[] arr, int N)
    {
        // If number of elements are less than 3, then no
        // triangle is possible
        if (N < 3)
            return false;
        // first sort the array
        Arrays.sort(arr);
        // loop for all 3 consecutive triplets
        for (int i = 0; i < N - 2; i++)
            // If triplet satisfies triangle condition, break
            if (arr[i] + arr[i + 1] > arr[i + 2])
                return true;
        return false;
    }
 
    // Driver Code
    static public void main(String[] args)
    {
        int[] arr = { 5, 4, 3, 1, 2 };
        int N = arr.length;
        if (isPossibleTriangle(arr, N))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

Python

# Python3 code to find if
# it is possible to form a
# triangle from array values
 
# Method prints possible
# triangle when array
# values are taken as sides
def isPossibleTriangle (arr , N):
     
    # If number of elements
    # are less than 3, then
    # no triangle is possible
    if N < 3:
        return False
     
    # first sort the array
    arr.sort()
     
    # loop for all 3
    # consecutive triplets
    for i in range(N - 2):
         
        # If triplet satisfies triangle
        # condition, break
        if arr[i] + arr[i + 1] > arr[i + 2]:
            return True
 
# Driver Code
arr = [5, 4, 3, 1, 2]
N = len(arr)
print("Yes" if isPossibleTriangle(arr, N) else "No")
 
# This code is contributed
# by "Sharad_Bhardwaj".

C#

// C# program to find if
// it is possible to form
// a triangle from array values
using System;
 
class GFG
{
         
    // Method prints possible
    // triangle when array values
    // are taken as sides
    static bool isPossibleTriangle(int []arr,
                                   int N)
    {
        // If number of elements
        // are less than 3, then
        // no triangle is possible
        if (N < 3)
            return false;
     
        // first sort the array
        Array.Sort(arr);
     
        // loop for all 3
        // consecutive triplets
        for (int i = 0; i < N - 2; i++)
     
            // If triplet satisfies triangle
            // condition, break
            if (arr[i] + arr[i + 1] > arr[i + 2])
                return true;
                 
        return false;
    }
     
    // Driver Code
    static public void Main ()
    {
        int []arr = {5, 4, 3, 1, 2};
        int N = arr.Length;
         
        if(isPossibleTriangle(arr, N))
            Console.WriteLine("Yes" );
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP program to find if
// it is possible to form
// a triangle from array values
 
 
// Method prints possible
// triangle when array values
// are taken as sides
function isPossibleTriangle( $arr, $N)
{
    // If number of elements are
    // less than 3, then no
    // triangle is possible
    if ($N < 3)
    return false;
 
    // first sort the array
    sort($arr);
 
    // loop for all 3
    // consecutive triplets
    for ( $i = 0; $i < $N - 2; $i++)
 
        // If triplet satisfies triangle
        // condition, break
        if ($arr[$i] + $arr[$i + 1] > $arr[$i + 2])
            return true;
}
 
// Driver Code
$arr = array(5, 4, 3, 1, 2);
$N = count($arr);
 
if(isPossibleTriangle($arr,$N))
echo "Yes" ;
else               
echo "No";
 
// This code is contributed by vt_m
?>

Javascript

<script>
// Javascript program to find if it is
// possible to form a triangle
// from array values
 
    // Method prints possible
    // triangle when array values
    // are taken as sides
    function isPossibleTriangle(arr, N)
    {
           
        // If number of elements are
        // less than 3, then no
        // triangle is possible
        if (N < 3)
            return false;
       
        // first sort the array
        arr.sort();
       
        // loop for all 3
        // consecutive triplets
        for (let i = 0; i < N - 2; i++)
       
            // If triplet satisfies
            // triangle condition, break
            if (arr[i] + arr[i + 1] > arr[i + 2])
                return true;
                   
        return false;
    }
      
// Driver code   
 
        let arr = [5, 4, 3, 1, 2];
        let N = arr.length;
           
        if(isPossibleTriangle(arr, N))
            document.write("Yes" );
        else
            document.write("No");
     
    // This code is contributed by susmitakundugoaldanga.
</script>
Producción

Yes

Este artículo es una contribución de Utkarsh Trivedi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *