Java实现三角形计数

题:

  

解:

  这道题考的是穷举的算法。

  一开始看到这道题的时候,本能的想到用递归实现。但使用递归的话数据少没问题,数据多了之后会抛栈溢出的异常。我查了一下,原因是使用递归创建了太多的变量,

  每个变量创建的时候都会有一个“栈帧”,而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 }

 

posted @ 2017-06-24 15:05  南橘  阅读(1456)  评论(0编辑  收藏  举报
蜘蛛