【leetcode】Valid Triangle Number
题目:
Given an array consists of non-negative integers, your task is to count the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle. Example 1:
Input: [2,2,3,4]
Output: 3
Explanation:
Valid combinations are:
2,3,4 (using the first 2)
2,3,4 (using the second 2)
2,2,3
Note:
The length of the given array won't exceed 1000.
The integers in the given array are in the range of [0, 1000].
解析:
首先如何判断三个边长能否组成一个三角形,这个初中数学就学过——两个小边的和大于最大边的边长。
def checkValid(self,a,b,c):
return (a+b) > c
因此,很容易得到解法,对nums数组排序后,做全排列,依次检查每种组合是否符合要求。
def triangleNumber2(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
nums.sort()
for i in range(0,len(nums)-2):
for j in range(i+1,len(nums)-1):
for k in range(j+1,len(nums)):
if True == self.checkValid(nums[i], nums[j], nums[k]):
count += 1
#print nums[i], nums[j], nums[k]
else:
break
return count
但是非常遗憾,这种解法的复杂度是 O(n*3),超时了。根据判定中给出的超时输入发现,nums里面很多边长的数值是相同的。
Last executed input:
[33,97,81,65,30,58,83,83,66,85,78,40,51,61,86,94,42,17,35,18,45,27,56,78,36,97,6,51,76,26,68,68,61,87,13,98,93,80,24,34,19,90,85,89,83,15,41,52,25,16,61,51,19,6,40,79,25,88,65,85,0,42,78,27,30,68,47,67,40,26,15,72,20,45,88,82,12,82,95,1,46,56,83,20,65,39,13,92,36,99,74,50,46,8,27,45,36,55,50,0]
因此可以考虑优化算法,首先统计三个边长都不一样的情况,然后再考虑等腰三角形的情况,最后是等边三角形。
def triangleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#用一个list计数所有边长出线的次数,下标是边长值,对应的值是边长值出现的次数
count = 0
l = []
for i in range(0,1000+1):
l.append(0) for i in nums:
l[i] += 1
for i in range(1,len(l)-2):
if l[i] == 0:
continue
for j in range(i+1,len(l)-1):
if l[j] == 0:
continue
for k in range(j+1,len(l)):
if l[k] == 0:
continue
if True == self.checkValid(i,j,k):
count += (l[i]*l[j]*l[k])
else:
break
#dup
for i in range(1,len(l)):
if l[i] == 0 or l[i] == 1:
continue
else:
#print 'i:',i
#等腰三角形,如果某个边长值的出线的次数为n(n>=2),表示可以组成等腰三角形。根据组合的原理,两个腰可以得到C(2,n)
#然后根据 2*边长值与其他非自身边长值进行比较,得到等腰三角形的数量
for j in range(1,len(l)):
if 2*i > j and l[j] > 0 and j != i:
count += (l[i]*(l[i]-1))/2*l[j]
#等边三角形,这个也是组合,如果某个边长值的出线的次数为n(n>=3),表示可以组成等边三角形。
#根据组合的原理,可以等到的种数为C(3,n)
if l[i] >= 3:
count += (l[i]*(l[i]-1)*(l[i]-2))/6 return count
这样优化之后,效率得到了很大的提升,但是还是不够。进一步检查发现,list中无效的元素太多,可以考虑过滤掉很多边长值出现次数为0的元素,如代码所示,用一个ul对l中的数据进行过滤。
def triangleNumber3(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
l = []
for i in range(0,1000+1):
l.append(0) for i in nums:
l[i] += 1
#print l
ul = []
for i in range(0,len(l)):
if l[i] > 0:
ul.append(i)
#print ul
for i in range(0,len(ul)-2):
for j in range(i+1,len(ul)-1):
for k in range(j+1,len(ul)):
if True == self.checkValid(ul[i],ul[j],ul[k]):
count += (l[ul[i]]*l[ul[j]]*l[ul[k]])
#print i,j,k
else:
break
#dup
#print count
for i in range(0,len(ul)):
if l[ul[i]] == 0 or l[ul[i]] == 1 or ul[i] == 0:
continue
else:
#print 'i:',i
for j in range(0,len(ul)):
if 2*ul[i] > ul[j] and l[ul[j]] > 0 and j != i and ul[j] != 0:
#print (l[i]*(l[i]-1))/2
count += (l[ul[i]]*(l[ul[i]]-1))/2*l[ul[j]]
#print count
if l[ul[i]] >= 3:
count += (l[ul[i]]*(l[ul[i]]-1)*(l[ul[i]]-2))/6 return count
这样再一优化之后,终于通过了。

【leetcode】Valid Triangle Number的更多相关文章
- 【LeetCode】120. Triangle 解题报告(Python)
[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)
[LeetCode]375. Guess Number Higher or Lower II 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)
[LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...
- Leetcode 之 Valid Triangle Number
611. Valid Triangle Number 1.Problem Given an array consists of non-negative integers, your task is ...
- leetcode 611. Valid Triangle Number 、259. 3Sum Smaller(lintcode 918. 3Sum Smaller)
这两个题几乎一样,只是说611. Valid Triangle Number满足大于条件,259. 3Sum Smaller满足小于条件,两者都是先排序,然后用双指针的方式. 611. Valid T ...
- 【leetcode】Valid Number
Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- LeetCode 611. Valid Triangle Number有效三角形的个数 (C++)
题目: Given an array consists of non-negative integers, your task is to count the number of triplets c ...
随机推荐
- Postman接口测试动态传参——动态获取token值
上午刚学会jmeter动态传参,下午研究了下postman也知道怎么动态获取token了. 主要就是第1行和第2行代码,第3行加上是希望Test Results有个返回值,如果不加第3行运行成功后也看 ...
- Cocos2d-X多线程(4) 在子线程中进行网络请求
新版本的android系统已经不允许在UI线程中进行网络请求了,必须新建一个线程. 代码实操: 头文件: #ifndef __TestThreadHttp_SCENE_H__ #define __Te ...
- Mybatis 之 SQL生成技巧
一.增 1.<trim> 和<if>实现数据插入 <insert id="addInOrder" parameterType="XXX.mo ...
- Git提示要输入密码
在服务器上Git pull或者push时,一直提示要输入密码,但这个密码又不是Gitlab账户的密码,经过同学指点,原来是项目主分支被保护起来了,处于protected的状态,因为目前只有我一个人 在 ...
- 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试
[神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...
- 【miscellaneous】监狱智能视频监控系统设计解决方案
监狱智能视频监控系统设计解决方案 一.系统概况 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突 ...
- 数组被遗忘的内置对象--》Array.find()
需求:一个数组包含很多对象,对象中有很多属性.现在给你一个值,且这个值再这个数组的某个对象存在,那么如何找到这个对象? 首先想的是for循环遍历,但这样非常麻烦,js给我们提供了一个find()方法, ...
- jinja2模板接受
from flask import Flask,render_template app = Flask(__name__)#template_folder='templates',默认就是templa ...
- CentOS添加使用
在本机安装虚拟机,虚拟机安装CentSO.也可以装双系统,双系统问题更多 环境:win7 64 位 1.查看电脑是否可虚拟化(在百度查) 2.查看电脑是否打开虚拟机设置,如果没有,百度如何开启 打开虚 ...
- hibernate字段映射枚举类型
上一篇介绍了mybatis字段映射枚举类型,这一篇给大家介绍一下hibernate字段怎么去映射枚举类型的(这只是一种参考方式,映射方法还有很多种). 还是以上篇sku表为例,sku表里一个statu ...