zoukankan      html  css  js  c++  java
  • 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 }
    欢迎提出意见或建议!!!
  • 相关阅读:
    SPLAY,LCT学习笔记(五)
    SPLAY,LCT学习笔记(四)
    SPLAY,LCT学习笔记(三)
    NOI 2012 随机数生成器
    SPLAY,LCT学习笔记(二)
    SPLAY,LCT学习笔记(一)
    bzoj 1503 郁闷的出纳员
    bzoj 1112 poi 2008 砖块
    bzoj 1064 noi2008 假面舞会题解
    数论知识点总结(noip范围)
  • 原文地址:https://www.cnblogs.com/gaofei-1/p/7073422.html
Copyright © 2011-2022 走看看