贪心题目:三角形的最大周长

文章目录

题目

标题和出处

标题:三角形的最大周长

出处:976. 三角形的最大周长

难度

3 级

题目描述

要求

给定一个整数数组 nums \texttt{nums} nums,返回从该数组中取出三个元素作为边长的面积不为零的最大三角形周长。如果不能形成任何面积不为零的三角形,返回 0 \texttt{0} 0。

示例

示例 1:

输入: nums = 2,1,2 \texttt{nums = 2,1,2} nums = 2,1,2

输出: 5 \texttt{5} 5

示例 2:

输入: nums = 1,2,1 \texttt{nums = 1,2,1} nums = 1,2,1

输出: 0 \texttt{0} 0

数据范围

  • 3 ≤ nums.length ≤ 10 4 \texttt{3} \le \texttt{nums.length} \le \texttt{10}^\texttt{4} 3≤nums.length≤104
  • 1 ≤ numsi ≤ 10 6 \texttt{1} \le \texttt{numsi} \le \texttt{10}^\texttt{6} 1≤numsi≤106

解法

思路和算法

由于整数数组 nums \textit{nums} nums 中的所有元素都大于零,因此数组 nums \textit{nums} nums 中的所有元素都是正整数。

三个正整数可以组成三角形的三条边的边长,等价于其中两个较小的正整数之和大于最大的正整数。用 a a a、 b b b 和 c c c 表示三角形的三条边的边长,其中 a ≤ b ≤ c a \le b \le c a≤b≤c,则应满足 a + b > c a + b > c a+b>c。为方便处理,首先将数组 nums \textit{nums} nums 按升序排序。

当最大边长 c c c 确定时,为了使三角形的周长最大, a a a 和 b b b 应取最大值。对于 i ≥ 2 i \ge 2 i≥2,当 c = nums i c = \textit{nums}i c=numsi 时,应取 b = nums i − 1 b = \textit{nums}i - 1 b=numsi−1 和 a = nums i − 2 a = \textit{nums}i - 2 a=numsi−2。如果此时 a + b > c a + b > c a+b>c,则三角形的最大周长为 a + b + c a + b + c a+b+c。如果此时 a + b ≤ c a + b \le c a+b≤c,则 a a a 和 b b b 不能取更大值,如果将 a a a 和 b b b 换成 a ′ a' a′ 和 b ′ b' b′,则必有 a ′ ≤ a a' \le a a′≤a, b ′ ≤ b b' \le b b′≤b, a ′ + b ′ ≤ a + b ≤ c a' + b' \le a + b \le c a′+b′≤a+b≤c,因此不存在以 c c c 为最大边长的三角形。

根据上述分析,可以使用贪心的思想计算最大三角形周长。

具体做法是,首先将数组 nums \textit{nums} nums 按升序排序,然后反向遍历数组 nums \textit{nums} nums,判断每组相邻三个元素是否可以组成三角形的三条边的边长,如果可以则将三个元素之和作为最大三角形周长返回。如果遍历结束之后仍未遇到相邻三个元素可以组成三角形的三条边的边长,则不能形成面积不为零的三角形,返回 0 0 0。

代码

java 复制代码
class Solution {
    public int largestPerimeter(int[] nums) {
        Arrays.sort(nums);
        for (int i = nums.length - 3; i >= 0; i--) {
            if (nums[i] + nums[i + 1] > nums[i + 2]) {
                return nums[i] + nums[i + 1] + nums[i + 2];
            }
        }
        return 0;
    }
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间,排序之后遍历数组需要 O ( n ) O(n) O(n) 的时间,因此时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)。

  • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间。

相关推荐
吞下星星的少年·-·2 小时前
Div.2 CF edu195A题(数学,贪心)
数学·算法·贪心
伟大的车尔尼19 小时前
贪心题目:交换一次的先前排列
贪心
lvwangshu2 天前
CF1882D Tree XOR 题解
动态规划·题解·贪心·dp·树形dp·换根dp·性质题·思维好题·推导题
伟大的车尔尼3 天前
贪心题目:救生艇
贪心
Jasmine_llq3 天前
《P8816 [CSP-J 2022] 上升点列》
数据结构·算法·贪心·排序·二维动态规划 dp·类背包状态转移
lvwangshu4 天前
字符串 题解
字符串·trie·题解·贪心·技巧·性质题·思维好题
Tisfy9 天前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
伟大的车尔尼9 天前
贪心题目:单调递增的数字
贪心
Tisfy9 天前
LeetCode 3727.最大交替平方和:排序 (双指针可选)
算法·leetcode·题解·贪心·数组·排序
jyyyx的算法博客13 天前
机器人开箱子【贪心 + 模拟】
贪心·模拟