1. 程式人生 > >Java實現三角形計數

Java實現三角形計數

最小 三角形 內存 最大的 max 如果 棧溢出 rgs static

題:

  技術分享

解:

  這道題考的是窮舉的算法。

  一開始看到這道題的時候,本能的想到用遞歸實現。但使用遞歸的話數據少沒問題,數據多了之後會拋棧溢出的異常。我查了一下,原因是使用遞歸創建了太多的變量,

  每個變量創建的時候都會有一個“棧幀”,而Java虛擬機對棧幀有限制,不能超出一個範圍。

  並且遞歸和循環相比,遞歸的效率明顯比循環低下,如果想要寫一個算法的話,盡量不要使用遞歸,一方面是因為遞歸會創建很多變量,占用內存,另一方面是遞歸極容

  易無限遞歸。

  ---------------

  最後使用循環嵌套的方式完成了。

代碼:

  

 1
package com.lintcode; 2 3 /** 4 * 三角形計數 5 * 給定一個整數數組,在該數組中,尋找三個數,分別代表三角形三條邊的長度, 6 * 問,可以尋找到多少組這樣的三個數來組成三角形? 7 * @author Administrator 8 */ 9 public class Test_003 { 10 // 這道題不能用遞歸,數據少的話還可以,但是多了就會堆棧溢出。 11 // 這道題就是考“窮舉”,列出所有的可能性,再判斷。三角形三個邊需要三個數字,就循環嵌套三層。 12 // 然後找出三個數字中最大的和最小的和中間數,判斷是否構成三角形。
13 /** 14 * @param args 15 */ 16 public static void main(String[] args) { 17 int[] S = new int[200]; 18 for (int i = 0; i < 200; i++) { 19 S[i] = i+1; 20 } 21 int count = triangleCount(S); 22 System.out.println(count); 23 }
24 25 public static int triangleCount(int S[]) { 26 int count = 0; 27 for(int i=0; i<S.length-2; i++){//第一條邊 28 for (int j = i+1; j < S.length-1; j++) {//第二條邊 29 for (int k = j+1; k < S.length; k++) {//第三條邊 30 int min = getMin(S[i],S[j],S[k]); 31 int max = getMax(S[i],S[j],S[k]); 32 int middle = S[i]+S[j]+S[k]-min-max; 33 if ((min+middle)>max || (min==max)) { 34 count++; 35 } 36 } 37 } 38 } 39 return count; 40 } 41 //求最小值 42 private static int getMin(int a, int b, int c) { 43 int min = a; 44 if (min>b) { 45 min=b; 46 } 47 if (min>c) { 48 min=c; 49 } 50 return min; 51 } 52 //求最大值 53 private static int getMax(int a, int b, int c) { 54 int max = a; 55 if (max<b) { 56 max=b; 57 } 58 if (max<c) { 59 max=c; 60 } 61 return max; 62 } 63 }

Java實現三角形計數