Leetcode of August

 

class Solution:
    def triangleNumber(self, nums: List[int]) -> int:
        n = len(nums)
        nums.sort()
        ans = 0
        # 固定最大边, a + b > c
        for i in range(n - 1, 1, -1):
            l, r = 0, i - 1
            # 两数之和问题!
            while l < r:
                # 两数之和大于最大边,他们之间的所有值作为左端点,均可以和右端点构成答案
                if nums[l] + nums[r] > nums[i]:
                    ans += r - l
                    r -= 1
                else:
                    # 小于最大边,构不成答案,之后的右端点都需要更大的左端点才有可能继续构成答案
                    l += 1
        return ans



        #回溯法
        def help(nums):
            a,b,c = nums[0],nums[1],nums[2]
            if a+b>c and a+c>b and c+b>a and a-b<c and a-c<b and c-b<a:
                return True
            return False
 
        def huisu(index,path,count,nums):
            
            if len(path)==3 and help(path):
                count.append(0)
                return 
            if len(path)>3:
                return
            for i in range(index,len(nums)):
                path.append(nums[i])
                huisu(i+1,path,count,nums)
                path.pop()
        count = []
        nums = [2,2,3,4]
        huisu(0,[],count,nums)
        return len(count)

 题目分析:

        1、回溯法

                这个就是所谓的全排列的问题,是回溯算法非常经典的一个应用,但是必须搞清楚的是判断三个数能否组成三角形的条件,如此一来就比较简单了。

        2、排序+双指针法

                先对整个数据进行升序排序排序,然后从i=2开始固定一个最大边,在判断其余两边之后是不是大于第三边。如果最小的两个边都大于最大的边了,那么自然满足判定三角形的条件了。固定一个最大边,然后在l和r这个区间进行判断,如果其结果是大于第三边,那么是没问题的,如果结果不是大于第三边。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值