976. Largest Perimeter Triangle

976. 三角形的最大周长

给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。

如果不能形成任何面积不为零的三角形,返回 0

 

    示例 1:

    输入:[2,1,2]
    输出:5
    

    示例 2:

    输入:[1,2,1]
    输出:0
    

    示例 3:

    输入:[3,2,3,4]
    输出:10
    

    示例 4:

    输入:[3,6,2,3]
    输出:8
    

     

    提示:

    1. 3 <= A.length <= 10000
    2. 1 <= A[i] <= 10^6

    解法一(暴力搜索,低效,超时错误)

    //时间复杂度O(n^3), 空间复杂度O(1)
    class Solution {
    public:
        int getPerimeter(int a, int b, int c) {
            return a + b > c && a + c > b && b + c > a ? a + b + c : 0;
        }
        int largestPerimeter(vector<int>& A) {
            int n = A.size(), maxPmt = 0;
            for(int i = 0; i < n - 2; i++) {
                for(int j = i + 1; j < n - 1; j++) {
                    for(int k = j + 1; k < n; k++) {
                        maxPmt = max(maxPmt, getPerimeter(A[i], A[j], A[k]));
                    }
                }
            }
            return maxPmt;
        }
    };

    解法二

    class Solution {
    public:
        int largestPerimeter(vector<int>& A) {
            sort(A.rbegin(), A.rend());
            int right = A.size() - 2;
            for(int i = 0; i < right; i++) {
                if(A[i] < A[i + 1] + A[i + 2]) return A[i] + A[i + 1] + A[i + 2];
            }
            return 0;
        }
    };

    总结:

    解法一是找到所有三条边可能的组合,判断是否可构成三角形,并记录其最大周长,O(n^3)很低效。

    解法二先对数组进行降序排序,再从前向后判断相邻三边是否可构成三角形,若是则直接返回,否就继续向后查找,直到最后没找到就返回0。

    2019/08/20 12:01
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值