作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/largest-perimeter-triangle/

题目描述

Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths.

If it is impossible to form any triangle of non-zero area, return 0.

Example 1:

Input: [2,1,2]
Output: 5

Example 2:

Input: [1,2,1]
Output: 0

Example 3:

Input: [3,2,3,4]
Output: 10

Example 4:

Input: [3,6,2,3]
Output: 8

Note:

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

题目大意

从一个数组中选择3条边构成三角形,求该三角形最大的周长。

解题方法

排序

首先,我们肯定需要排序的,这个不解释。

假设排序完成之后的数组为[a, b, c, d, e, f],其中a <= b <= c <= d <= e <= f.为了尽可能构成周长最大的三角形,我们从右向左进行遍历。只需要对连续的三条边进行判断即可找出周长最大的三角形。理由如下。

抽出三条边,假设为d,e,f,那么这三条边组成三角形的充分条件是d + e > f。下面进行证明:

对于任意三条边,能组成三角形的充分条件是两边之和大于第三边,两边之差小于第三边。由于d <= e <= f,显然有e + f > d,d + f > e。又d + e > f,则满足任意两边之和大于第三边。由于d <= e <= f,则e - d < f。又d + e > f,则f - e < d, f - d < e,则满足任意两边只差小于第三边。所以,当d + e > f时能够成三角形。

下面证明选取的次大边和最大边必须相邻,即如果最大边选择f,则次大边必须选择e。由d + e > f知, 最大边 - 次大边 < 最小边。当我们次大边选择e时,假如最小边无论如何选择不能构成三角形,即target = f - e > d。那么,次大边选择更小的数字时,target会更大,仍然有target = f - d > f - e > d > c。总之,如果当次大边选择和最大边相邻时,如果不能构成三角形,则次大边和最大边不相邻,更不能构成三角形。

再下面证明,最小边必须和次大边必须相邻,即如果最大边选择f、次大边选择e时,最小边必须选择d。这个很好证明,由于d + e > f,即target = f - e < 最小边,我们肯定只能在满足该条件的边中选择最大的,才能使得构成三角形的周长最大。而数组是已经排了序的,所以,最小边选择d时,要么不能构成三角形,要么就构成在最大边和次大边为f,e时周长最大的三角形。

综上,在排序了的数组中选择三条边构成最大周长的三角形的充分条件是,三条边必须连续选择,且尽可能选择最大的边。

python代码如下:

class Solution(object):
def largestPerimeter(self, A):
"""
:type A: List[int]
:rtype: int
"""
A.sort()
N = len(A)
res = 0
# A[i - 2], A[i - 1], A[i]
for i in range(N - 1, 1, -1):
if A[i - 2] + A[i - 1] > A[i]:
return A[i - 2] + A[i - 1] + A[i]
return 0

日期

2019 年 1 月 13 日 —— 时间太快了

【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)的更多相关文章

  1. LeetCode 976 Largest Perimeter Triangle 解题报告

    题目要求 Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...

  2. LeetCode 976. Largest Perimeter Triangle (三角形的最大周长)

    题目标签:Array 题目给了我们一个 边长的 array, 让我们找出 最大边长和的三角形,当然前提得是这三条边能组成三角形.如果array 里得边长组成不了三角形,返回0. 最直接的理解就是,找到 ...

  3. Leetcode 976. Largest Perimeter Triangle

    送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...

  4. 【Leetcode_easy】976. Largest Perimeter Triangle

    problem 976. Largest Perimeter Triangle solution: class Solution { public: int largestPerimeter(vect ...

  5. 【leetcode】976. Largest Perimeter Triangle

    题目如下: Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...

  6. 976. Largest Perimeter Triangle

    Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, ...

  7. 「Leetcode」976. Largest Perimeter Triangle(C++)

    分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立. ...

  8. 【LeetCode】62. Unique Paths 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...

  9. LeetCode 976. 三角形的最大周长(Largest Perimeter Triangle) 33

    976. 三角形的最大周长 976. Largest Perimeter Triangle 题目描述 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. ...

随机推荐

  1. [R] 添加误差棒的分组折线图:geom_path: Each group consists of only one observation. Do you need to adjust the...

    想做一个简单的分组折线图,并添加误差棒,类似下面这样的: 用ggplot似乎很简单就能实现:ggplot+geom_errorbar+geom_line+geom_point,重点在于计算误差棒. 还 ...

  2. micropython1.16官方文档转PDF

    折腾了一天,终于把micropython1.16的官方文档给转成了pdf格式. 不过转换成PDF格式以后存在两点问题: 1.PDF文档有些地方的排版中有些行距没有调整好: 2.使用latex编译tex ...

  3. 23-Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  4. OpenSSH 密码和公钥认证原理探究

    目录 配置和保护SSH H3 - 使用SSH 访问远程命令行 H4 - 什么是OpenSSH ? H4 - 登录方式: H4 - 登录并执行临时命令: H4 - 查看登录用户 H4 - 登录原理 密码 ...

  5. C#序号

    OnRowCreated="gridViewCorrection_RowCreated" <asp:BoundField HeaderText="序号" ...

  6. A Child's History of England.24

    Besides all these troubles, William the Conqueror was troubled by quarrels among his sons. He had th ...

  7. Flink(九)【Flink的重启策略】

    目录 1.Flink的重启策略 2.重启策略 2.1未开启checkpoint 2.2开启checkpoint 1)不设置重启策略 2)不重启 3)固定延迟重启(默认) 4)失败率重启 3.重启效果演 ...

  8. Linux基础命令---mput上传ftp文件

    mput 使用lftp登录ftp服务器之后,可以使用put指令将文件上传到服务器.mput指令可以使用通配符,而put指令则不可以.   1.语法       mput [-c]  [-d] [-a] ...

  9. oralce 存储过程传入 record 类型的参数?

    先定义一个 package , package中含有一个 record 类型的变量 create or replace package pkg_record is type emp_record is ...

  10. MyBatis(3):优化MyBatis配置文件

    一.连接数据库的配置单独放在一个properties文件中 1,创建一个database.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql: ...