Count of acute, obtuse and right triangles with given sides - GeeksforGeeks

16 Apr, 2021
Given an array of n positive distinct integers representing lengths of lines that can form a triangle. The task is to find the number of acute triangles, obtuse triangles, and right triangles separately that can be formed from the given array.
Examples: 
Input : arr[] = { 2, 3, 9, 10, 12, 15 }.
Output :
Acute Triangle: 2
Right Triangle: 1
Obtuse Triangle: 4

Acute triangles that can be formed are {10, 12, 15} 
and { 9, 10, 12 }.
Right triangles that can be formed are {9, 12, 15}.
Obtuse triangles that can be formed are {2, 9, 10}, 
{3, 9, 10}, {3, 10, 12} and {9, 10, 15}.
Triangle having edges a, b, c, a <= b c. If a2 + b2 > c2, then it is acute triangle. If a2 + b2 = c2, then it is right triangle. If a2 + b2 < c2, then it is obtuse triangle.
Method 1 (Simple): A brute force can be, use three loops, one for each side. Check the above three conditions if a triangle is possible from three sides.
Method 2 (Efficient): An efficient approach is to first sort the array and run two loops for side a and b (a<b). Then find the farthest point q where a + b > c. So, from b to q all triangle are possible. Also find a farthest point p where a2 + b2 >= c2. Now, observe if a2 + b2 = c2, then increment count of right triangles. Also, the acute triangle will be p – b – 1, and the obtuse triangle will be q – p. 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count of acute, obtuse and right// triangles in an array#include <bits/stdc++.h>using namespace std; // Find the number of acute, right, obtuse triangle// that can be formed from given array.void findTriangle(int a[], int n){    int b[n + 2];     // Finding the square of each element of array.    for (int i = 0; i < n; i++)        b[i] = a[i] * a[i];     // Sort the sides of array and their squares.    sort(a, a + n);    sort(b, b + n);     // x for acute triangles    // y for right triangles    // z for obtuse triangles    int x=0,y=0,z=0;    for (int i=0; i<n; i++)    {        int p = i+1;        int q = i+1;         for (int j=i+1; j<n; j++)        {            // Finding the farthest point p where            // a^2 + b^2 >= c^2.            while (p<n-1 && b[i]+b[j]>=b[p+1])                p++;             q = max(q, p);             // Finding the farthest point q where            // a + b > c.            while (q<n-1 && a[i]+a[j]>a[q+1])                q++;             // If point p make right triangle.            if (b[i]+b[j]==b[p])            {                // All triangle between j and p are acute                // triangles. So add p - j - 1 in x.                x += max(p - j - 1, 0);                 // Increment y by 1.                y++;                 // All triangle between q and p are acute                // triangles. So add q - p in z.                z += q - p;            }             // If no right triangle            else            {                // All triangle between j and p are acute                // triangles. So add p - j in x.                x += max(p - j, 0);                 // All triangle between q and p are acute                // triangles. So add q - p in z.                z += q - p;            }        }    }     cout << "Acute Triangle: " << x << endl;    cout << "Right Triangle: " << y << endl;    cout << "Obtuse Triangle: " << z << endl;} // Driver Codeint main(){    int arr[] = {2, 3, 9, 10, 12, 15};    int n = sizeof(arr)/sizeof(arr[0]);    findTriangle(arr, n);    return 0;}
// Java program to count of// acute, obtuse and right// triangles in an arrayimport java.util.*;class GFG{     // Find the number of acute,// right, obtuse triangle// that can be formed from// given array.static void findTriangle(int a[],                         int n){  int b[] = new int[n];   // Finding the square of  // each element of array.  for (int i = 0; i < n; i++)    b[i] = a[i] * a[i];   // Sort the sides of array  // and their squares.  Arrays.sort(a);  Arrays.sort(b);   // x for acute triangles  // y for right triangles  // z for obtuse triangles  int x = 0, y = 0, z = 0;  for (int i = 0; i < n; i++)  {    int p = i + 1;    int q = i + 1;     for (int j = i + 1; j < n; j++)    {      // Finding the farthest point      // p where a^2 + b^2 >= c^2.      while (p < n - 1 &&             b[i] + b[j] >= b[p + 1])        p++;       q = Math.max(q, p);       // Finding the farthest point      // q where a + b > c.      while (q < n - 1 &&             a[i] + a[j] > a[q + 1])        q++;       // If point p make right triangle.      if (b[i] + b[j] == b[p])      {        // All triangle between j        // and p are acute triangles.        // So add p - j - 1 in x.        x += Math.max(p - j - 1, 0);         // Increment y by 1.        y++;         // All triangle between q        // and p are acute triangles.        // So add q - p in z.        z += q - p;      }       // If no right triangle      else      {        // All triangle between        // j and p are acute triangles.        // So add p - j in x.        x += Math.max(p - j, 0);         // All triangle between q        // and p are acute triangles.        // So add q - p in z.        z += q - p;      }    }  }    System.out.println("Acute Triangle: " + x);  System.out.println("Right Triangle: " + y);  System.out.println("Obtuse Triangle: " + z);} // Driver Codepublic static void main(String[] args){  int arr[] = {2, 3, 9, 10, 12, 15};  int n = arr.length;  findTriangle(arr, n);}} // This code is contributed by Chitranayal
# Python3 program to count of acute, obtuse and right# triangles in an array # Find the number of acute, right, obtuse triangle# that can be formed from given array.def findTriangle(a, n) :         b = []    # Finding the square of each element of array    for i in range(n) :        b.append(a[i] * a[i])         # Sort the sides of array and their squares.    a.sort()    b.sort()        # x for acute triangles    # y for right triangles    # z for obtuse triangles    x, y, z = 0, 0, 0         for i in range(n) :        p = i+1        q = i+1        for j in range(i + 1, n) :            # Finding the farthest point p where            # a^2 + b^2 >= c^2.            while (p<n-1 and b[i]+b[j]>=b[p+1]) :                p += 1            q = max(q, p)            # Finding the farthest point q where            # a + b > c.            while (q<n-1 and a[i]+a[j]>a[q+1]) :                q += 1                             # If point p make right triangle.            if (b[i]+b[j]==b[p]) :                # All triangle between j and p are acute                # triangles. So add p - j - 1 in x.                x += max(p - j - 1, 0)                # Increment y by 1.                y += 1                # All triangle between q and p are acute                # triangles. So add q - p in z.                z += q - p            # If no right triangle            else :                # All triangle between j and p are acute                # triangles. So add p - j in x.                x += max(p - j, 0)                # All triangle between q and p are acute                # triangles. So add q - p in z.                z += q - p         print("Acute Triangle:",x )    print("Right Triangle:", y)    print("Obtuse Triangle:", z)  # Driver Codeif __name__ == "__main__" :     arr = [2, 3, 9, 10, 12, 15]    n = len(arr)    findTriangle(arr, n) # This code is contributed by Ryuga
// C# program to count of// acute, obtuse and right// triangles in an arrayusing System; class GFG{      // Find the number of acute,// right, obtuse triangle// that can be formed from// given array.static void findTriangle(int []a, int n){  int []b = new int[n];    // Finding the square of  // each element of array.  for(int i = 0; i < n; i++)    b[i] = a[i] * a[i];    // Sort the sides of array  // and their squares.  Array.Sort(a);  Array.Sort(b);    // x for acute triangles  // y for right triangles  // z for obtuse triangles  int x = 0, y = 0, z = 0;  for(int i = 0; i < n; i++)  {    int p = i + 1;    int q = i + 1;      for(int j = i + 1; j < n; j++)    {             // Finding the farthest point      // p where a^2 + b^2 >= c^2.      while (p < n - 1 &&             b[i] + b[j] >= b[p + 1])        p++;        q = Math.Max(q, p);        // Finding the farthest point      // q where a + b > c.      while (q < n - 1 &&             a[i] + a[j] > a[q + 1])        q++;        // If point p make right triangle.      if (b[i] + b[j] == b[p])      {                 // All triangle between j        // and p are acute triangles.        // So add p - j - 1 in x.        x += Math.Max(p - j - 1, 0);          // Increment y by 1.        y++;          // All triangle between q        // and p are acute triangles.        // So add q - p in z.        z += q - p;      }        // If no right triangle      else      {                 // All triangle between        // j and p are acute triangles.        // So add p - j in x.        x += Math.Max(p - j, 0);          // All triangle between q        // and p are acute triangles.        // So add q - p in z.        z += q - p;      }    }  }     Console.Write("Acute Triangle: " + x + "\n");  Console.Write("Right Triangle: " + y + "\n");  Console.Write("Obtuse Triangle: " + z + "\n");}  // Driver Codepublic static void Main(string[] args){  int []arr = { 2, 3, 9, 10, 12, 15 };  int n = arr.Length;     findTriangle(arr, n);}} // This code is contributed by rutvik_56
<?php// PHP program to count of acute, obtuse// and right triangles in an array // Find the number of acute, right, obtuse// triangle that can be formed from given array.function findTriangle($a, $n){    $b[$n + 2] = array();     // Finding the square of each    // element of array.    for ($i = 0; $i < $n; $i++)        $b[$i] = $a[$i] * $a[$i];     // Sort the sides of array and    // their squares.    sort($a);    sort($b);     // x for acute triangles    // y for right triangles    // z for obtuse triangles    $x = 0;    $y = 0;    $z = 0;    for ($i = 0; $i < $n; $i++)    {        $p = $i + 1;        $q = $i + 1;         for ($j = $i + 1; $j < $n; $j++)        {            // Finding the farthest point p            // where a^2 + b^2 >= c^2.            while ($p < $n - 1 &&                   $b[$i] + $b[$j] >= $b[$p + 1])                $p++;             $q = max($q, $p);             // Finding the farthest point q            // where a + b > c.            while ($q < $n - 1 &&                   $a[$i] + $a[$j] > $a[$q + 1])                $q++;             // If point p make right triangle.            if ($b[$i] + $b[$j] == $b[$p])            {                // All triangle between j and p are acute                // triangles. So add p - j - 1 in x.                $x += max($p - $j - 1, 0);                 // Increment y by 1.                $y++;                 // All triangle between q and p are                // acute triangles. So add q - p in z.                $z += $q - $p;            }             // If no right triangle            else            {                // All triangle between j and p are acute                // triangles. So add p - j in x.                $x += max($p - $j, 0);                 // All triangle between q and p are acute                // triangles. So add q - p in z.                $z += $q - $p;            }        }    }     echo "Acute Triangle: ", $x, "\n";    echo "Right Triangle: ", $y, "\n";    echo "Obtuse Triangle: ", $z, "\n";} // Driver Code$arr = array(2, 3, 9, 10, 12, 15);$n = sizeof($arr);findTriangle($arr, $n); // This code is contributed by akt_mit?>
<script> // Javascript program to count of// acute, obtuse and right// triangles in an array         // Find the number of acute,    // right, obtuse triangle    // that can be formed from    // given array.    function findTriangle(a,n)    {        let b=new Array(n);        for(let i=0;i<n;i++)        {            b[i]=0;        }                 // Finding the square of      // each element of array.      for (let i = 0; i < n; i++)        b[i] = a[i] * a[i];            // Sort the sides of array      // and their squares.      a.sort(function(i,j){return i-j;});      b.sort(function(i,j){return i-j;});             // x for acute triangles        // y for right triangles        // z for obtuse triangles        let x = 0, y = 0, z = 0;        for (let i = 0; i < n; i++)        {        let p = i + 1;        let q = i + 1;                 for (let j = i + 1; j < n; j++)        {          // Finding the farthest point          // p where a^2 + b^2 >= c^2.          while (p < n - 1 &&                 b[i] + b[j] >= b[p + 1])            p++;                   q = Math.max(q, p);                   // Finding the farthest point          // q where a + b > c.          while (q < n - 1 &&                 a[i] + a[j] > a[q + 1])            q++;                   // If point p make right triangle.          if (b[i] + b[j] == b[p])          {            // All triangle between j            // and p are acute triangles.            // So add p - j - 1 in x.            x += Math.max(p - j - 1, 0);                     // Increment y by 1.            y++;                     // All triangle between q            // and p are acute triangles.            // So add q - p in z.            z += q - p;          }                   // If no right triangle          else          {            // All triangle between            // j and p are acute triangles.            // So add p - j in x.            x += Math.max(p - j, 0);                     // All triangle between q            // and p are acute triangles.            // So add q - p in z.            z += q - p;          }        }        }                 document.write("Acute Triangle: " + x+"<br>");        document.write("Right Triangle: " + y+"<br>");        document.write("Obtuse Triangle: " + z+"<br>");           }    // Driver Code         let arr=[2, 3, 9, 10, 12, 15];    let n = arr.length;    findTriangle(arr, n);         // This code is contributed by avanitrachhadiya2155     </script>
Output: 
Acute Triangle: 2
Right Triangle: 1
Obtuse Triangle: 4
This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
ankthon
jit_t
ukasp
rutvik_56
avanitrachhadiya2155
Geometric
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Convex Hull using Divide and Conquer Algorithm
Orientation of 3 ordered points
Equation of circle when three points on the circle are given
Program to find slope of a line
Program to find line passing through 2 Points
Circle and Lattice Points
Maximum Manhattan distance between a distinct pair from N coordinates
Minimum Cost Polygon Triangulation
Quickhull Algorithm for Convex Hull
Check whether triangle is valid or not if three points are given