976. 三角形的最大周长(java)

题目链接 

976. 三角形的最大周长 - 力扣https://leetcode-cn.com/problems/largest-perimeter-triangle/

 

题目描述

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

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

示例 

输入:[2,1,2]
输出:5
输入:[1,2,1]
输出:0
输入:[3,2,3,4]
输出:10
输入:[3,6,2,3]
输出:8

解题思路 

依次遍历 + 最大堆(优先队列)

从题目中我们可以知道,该题要求的是 “ 返回可以组成三角形的最大周长”。

所以我们可以遍历该数组,把数组中的数据放入最大堆(通过重写对数器中的方法改变其排列顺序)。

先从堆中弹出三个数据cur1,cur2,cur3,然后 当堆不为空时,每次弹出一个数据。

始终让cur1为最大,cur2为次大,cur3为第三大(即新弹出的数据)。

如果cur1 < cur2  +  cur3,即满足三角形成立的条件,返回他们的和即可。 

贪心策略:即保持每次选择的数据为当前最大。

代码 

 


class Solution {
    public int largestPerimeter(int[] nums) {
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2.compareTo(o1);
            }
        });
        for(int item : nums){
            maxHeap.offer(item);
        }
        int cur1 = maxHeap.poll();
        int cur2 = maxHeap.poll();
        int cur3 = maxHeap.poll();
        if(cur1 < cur2 + cur3){
            return cur1 + cur2 + cur3;
        }
        while(!maxHeap.isEmpty()){
            cur1 = cur2;
            cur2 = cur3;
            cur3 = maxHeap.poll();
            System.out.println(cur3);
            if(cur1 < cur2 + cur3){
                return cur1 + cur2 + cur3;
            }
        }
        return 0;
    }
}

 

补充 

 有关优先队列的知识可以看看一看相关的博客,链接在下面哦。

 Java优先队列(PriorityQueue)_try to do-CSDN博客

感觉好久没更新了呀,最近要准备期中考试了,少更一些咯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值