美文网首页
三角形问题

三角形问题

作者: nafoahnaw | 来源:发表于2018-06-05 18:49 被阅读0次
/**
     * 有N根棍子,棍子i的长度为Ai,想从中取出3根棍子组成长度尽可能长的三角形
     * 输出最大周长,若无法组成,则返回0
     * sideLengthArray.length >= 3
     * @param sideLengthArray
     * @return
     */
    public int findMaxPerimeter(int[] sideLengthArray){
        /**
         * 思路:将给出棍子也就是数组按长度排序
         * 配合上组成三角形的条件,最长的一边小于另两边只和
         * 时间复杂度:排序使用归并排序 O(nlgn)
         * 在使用一次遍历找出结果
         * 综上 T(n) = O(nlgn)
         */
        int[] sortedArray = mergeSort(sideLengthArray, 0, sideLengthArray.length - 1);

        int maxPerimeter = 0;

        for (int i = 0; i < sortedArray.length; i++) {
            if(sortedArray[i] < sortedArray[i + 1] + sortedArray[i + 2]){
                //有解
                maxPerimeter = sortedArray[i] + sortedArray[i + 1] + sortedArray[i + 2];
                break;
            }
        }

        return maxPerimeter;
    }

    private int[] mergeSort(int[] sideLengthArray, int start, int end){
        if(sideLengthArray == null || sideLengthArray.length == 0){
            return sideLengthArray;
        }

        if(start == end){
            return new int[]{sideLengthArray[start]};
        }

        //归并排序注意middle的取法
        //(start+end)/2可能导致出现越界错误
        int middle = start + (end - start) / 2;
        int[] left = mergeSort(sideLengthArray, start, middle);
        int[] right = mergeSort(sideLengthArray, middle + 1, end);


        return merge(left, right);
    }

    private int[] merge(int[] left, int[] right){
        int size = left.length + right.length;
        int[] result = new int[size];
        int i = 0;
        int j = 0;
        int index = 0;
        while(i < left.length && j < right.length){
            if(left[i] > right[j]){
                result[index++] = left[i++];
            }else{
                result[index++] = right[j++];
            }
        }

        while(i < left.length){
            result[index++] = left[i++];
        }

        while(j < right.length){
            result[index++] = right[j++];
        }

        return result;
    }

相关文章

  • 第一二章

    第1章 一次自评价测试 问题:指出三角形是何种三角形 问题分析:三角形包含等腰三角形、等边三角形、不规则三角形 测...

  • 郭召良CBT进阶班第04讲:咨询问题三角形

    01.什么是咨询问题三角形 明确问题三角形是CBT咨询思维的第一步。它是指咨询问题、咨询目标和问题情境构成的三角形...

  • 解三角形

    解三角形 确定三角形中的基本量 确定三角形中的衍伸量 三角形的个数的确定 解三角形的综合性问题

  • 弱健壮的等价类测试用例

    构造下述三角形问题的弱健壮的等价类测试用例。 三角形问题:输入三个不超过 100 的正整数作为三角形的三条边, 判...

  • C语言 | 杨辉三角形

    C语言 | 杨辉三角形 在屏幕上显示杨辉三角形: 问题分析与算法设计 杨辉三角问题,正是(x + y)的N次方...

  • 解三角形与基本不等式综合

    解三角形问题当中有一类问题是最值问题,这类问题往往要结合基本不等式来解决。今天就来为大家分享几个解三角形与基本不等...

  • 解题思路

    利用解直角三角形的知识解决实际问题的一般过程是: (1)将实际问题抽象为数学问题(画出平面图形,转化为解直角三角形...

  • Opengl学习及调试

    2018.11.14 项目:https://learnopengl-cn.github.io/ 渲染三角形 问题:...

  • 7298T-1

    一个求三角形面积最大值的问题

  • 光栅化05-重心坐标

    前面提到,对于三角形而言,需要解决的两个问题可以更加具象地描述为: 我们现在来看第二个问题。 已知三角形的三个顶点...

网友评论

      本文标题:三角形问题

      本文链接:https://www.haomeiwen.com/subject/ptumsftx.html