2121 * 2,2,3 
2222 * <p> 
2323 * Note: 
24-  * The length of the given array won't exceed 1000. 
25-  * The integers in the given array are in the range of [0, 1000]. 
24+  * - The length of the given array won't exceed 1000. 
25+  * - The integers in the given array are in the range of [0, 1000]. 
26+  * - Triangle Property: Sum of any 2 sides must be greater than the 3rd side. 
2627 * 
2728 * @author rampatra 
2829 * @since 2019-08-07 
2930 */ 
3031public  class  ValidTriangleNumber  {
3132
32-     public  static  int  triangleNumber (int [] nums ) {
33-         int  l  = 0 ;
34-         int  r  = nums .length  - 1 ;
33+     /** 
34+      * Time complexity : O(n^2 log n). In worst case, the inner loop will take n log n (binary search applied n times). 
35+      * Space complexity : O(log n). Sorting takes O(log n) space. 
36+      * Runtime: <a href="https://leetcode.com/submissions/detail/250225175/">13 ms</a>. 
37+      * 
38+      * @param nums 
39+      * @return 
40+      */ 
41+     public  static  int  triangleNumberUsingBinarySearch (int [] nums ) {
3542        int  noOfTriangles  = 0 ;
3643
3744        Arrays .sort (nums );
3845
39-         // todo 
46+         for  (int  i  = 0 ; i  < nums .length  - 2 ; i ++) {
47+             int  k  = i  + 2 ;
48+             for  (int  j  = i  + 1 ; j  < nums .length  - 1 ; j ++) {
49+                 k  = binarySearch (nums , k , nums .length  - 1 , nums [i ] + nums [j ]);
50+                 if  (k  - j  - 1  > 0 ) {
51+                     noOfTriangles  += k  - j  - 1 ;
52+                 }
53+             }
54+         }
55+ 
56+         return  noOfTriangles ;
57+     }
58+ 
59+     private  static  int  binarySearch (int [] nums , int  low , int  high , int  num ) {
60+         while  (low  <= high ) {
61+             int  mid  = (low  + high ) / 2 ;
62+             if  (nums [mid ] < num ) {
63+                 low  = mid  + 1 ;
64+             } else  {
65+                 high  = mid  - 1 ;
66+             }
67+         }
68+ 
69+         return  low ;
70+     }
71+ 
72+     /** 
73+      * The concept is simple. For each pair (i,j), find the value of k such that nums[i] + nums[j] > nums[k] (as per 
74+      * triangle property). Once we find k then we can form k- j - 1 triangles. 
75+      * 
76+      * Time Complexity: O(n^2) Loop of k and j will be executed O(n^2) times in total, because, we do 
77+      * not reinitialize the value of k for a new value of j chosen(for the same i). Thus, the complexity 
78+      * will be O(n^2 + n^2) = O(n^2). 
79+      * Space Complexity: O(log n). Sorting takes O(log n) space. 
80+      * Runtime: <a href="https://leetcode.com/submissions/detail/250239099/">5 ms</a>. 
81+      * 
82+      * @param nums 
83+      * @return 
84+      */ 
85+     public  static  int  triangleNumber (int [] nums ) {
86+         int  noOfTriangles  = 0 ;
87+         Arrays .sort (nums );
88+ 
89+         for  (int  i  = 0 ; i  < nums .length  - 2 ; i ++) {
90+             int  k  = i  + 2 ;
91+             for  (int  j  = i  + 1 ; j  < nums .length  - 1 ; j ++) {
92+                 while  (k  < nums .length  && nums [i ] + nums [j ] > nums [k ]) {
93+                     k ++;
94+                 }
95+                 if  (k  - j  - 1  > 0 ) {
96+                     noOfTriangles  += k  - j  - 1 ;
97+                 }
98+             }
99+         }
40100
41101        return  noOfTriangles ;
42102    }
43103
44104    public  static  void  main (String [] args ) {
105+         assertEquals (0 , triangleNumberUsingBinarySearch (new  int []{}));
106+         assertEquals (0 , triangleNumberUsingBinarySearch (new  int []{1 }));
107+         assertEquals (3 , triangleNumberUsingBinarySearch (new  int []{2 , 2 , 3 , 4 }));
108+         assertEquals (0 , triangleNumberUsingBinarySearch (new  int []{0 , 1 , 0 , 1 }));
109+         assertEquals (7 , triangleNumberUsingBinarySearch (new  int []{1 , 2 , 3 , 4 , 5 , 6 }));
110+ 
111+         assertEquals (0 , triangleNumber (new  int []{}));
112+         assertEquals (0 , triangleNumber (new  int []{1 }));
45113        assertEquals (3 , triangleNumber (new  int []{2 , 2 , 3 , 4 }));
114+         assertEquals (0 , triangleNumber (new  int []{0 , 1 , 0 , 1 }));
115+         assertEquals (7 , triangleNumber (new  int []{1 , 2 , 3 , 4 , 5 , 6 }));
46116    }
47- }
117+ }
0 commit comments