【LeetCode】976. Largest Perimeter Triangle 解题报告(Python)
作者: 负雪明烛
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:
- 3 <= A.length <= 10000
- 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)的更多相关文章
- LeetCode 976 Largest Perimeter Triangle 解题报告
题目要求 Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- LeetCode 976. Largest Perimeter Triangle (三角形的最大周长)
题目标签:Array 题目给了我们一个 边长的 array, 让我们找出 最大边长和的三角形,当然前提得是这三条边能组成三角形.如果array 里得边长组成不了三角形,返回0. 最直接的理解就是,找到 ...
- Leetcode 976. Largest Perimeter Triangle
送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...
- 【Leetcode_easy】976. Largest Perimeter Triangle
problem 976. Largest Perimeter Triangle solution: class Solution { public: int largestPerimeter(vect ...
- 【leetcode】976. Largest Perimeter Triangle
题目如下: Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- 976. Largest Perimeter Triangle
Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, ...
- 「Leetcode」976. Largest Perimeter Triangle(C++)
分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立. ...
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ...
- LeetCode 976. 三角形的最大周长(Largest Perimeter Triangle) 33
976. 三角形的最大周长 976. Largest Perimeter Triangle 题目描述 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. ...
随机推荐
- Excel-数据分列的多种方法实现
2.数据->分列 (数据格式统一的精准分列)<=> 手动快捷键ctrl+E+等待 ("模糊模仿""分列)<=> 用函数实现(精准分列) 用函 ...
- MapReduce01 概述
MapReduce 概述 目录 MapReduce 概述 1.定义 2.优缺点 优点 缺点 3.MapReduce核心思想 4.MapReduce进程 5.官方 WordCount 源码 6.常用数据 ...
- javascript的原型与原型链
首先套用一句经典名言,JavaScript中万物皆对象. 但是对象又分为函数对象和普通对象. function f1(){}; var f2=function(){}; var f3=new Func ...
- Scala(八)【面向对象总结】
面向对象总结 面向对象 1.scala包 1.声明包 1.在文件第一行通过package 包名 2.package 包名{ .... } 第二种方法,包名只能在target目录才能看到 2.导入包 1 ...
- 数据存储SharePreferences详解
1.SharedPreferences存储 SharedPreferences时使用键值对的方式来存储数据的,也就是在保存一条数据时,需要给这条数据提供一个对应的键,这样在读取的时候就可以通过这个键把 ...
- Linux磁盘分区(二)之挂载卸载常用命令
Linux磁盘分区(二)之挂载卸载常用命令 转自:https://blog.csdn.net/qq_36183935/article/details/81053383 https: ...
- IntentFilter,PendingIntent
1.当Intent在组件间传递时,组件如果想告知Android系统自己能够响应那些Intent,那么就需要用到IntentFilter对象. IntentFilter对象负责过滤掉组件无法响应和处理的 ...
- RestTemplate进行访问分页PageInfo
废话少说,给你们看代码: //provide的controller @ResponseBody @RequestMapping(value = "details",method = ...
- 关于requests.exceptions.ConnectionError: HTTPSConnectionPool的问题
错误如下: raise ConnectionError(e, request=request)requests.exceptions.ConnectionError: HTTPSConnectionP ...
- C# 使用管理员权限运行程序
最近在开发OPCServer组件过程中,在注册opcServer是总是返回false,后来查找原因得知在本地主机注册opcServer时,需要使用管理员权限. OPCServer在一台机器上部署时只需 ...