力扣(leetcode) 611. 有效三角形的个数 (三指针法)

题目在这:https://leetcode-cn.com/problems/valid-triangle-number/

思路分析:

直接三重暴力循环直接超时。。。

三角形的三边条件:两边之和大于第三边嘛。我们可以使用三指针 来做这道题。

首先对于所给数组进行排序,降序排序~。
假设降序排序后得到的数组为 [4,3,2,2].
我们使 p1指向4, p2指向3 , p3 指向末尾的2。
判断p2加上p3是否大于p1 ,
如果大于 则p2到p3之间所有的数都可以使用,都是大于p1的。因为p3指向的是最小边,若移动p3 ,则必然会更大。
所以此时符合条件的数 为 p3-p2 。
然后我们将p2变小,即往后移动,继续试探。
如果 p3+p2 不大于p1 ,则我们将p3变大 ,往左移动,继续试探。

将上述操作全部放到循环里,该循环控制p1的指针位置。

完整代码

  res = 0
  nums.sort(reverse=True)
  for p1 in range(len(nums)-2): # 不包含len(nums)-2 也就是p1最后一个元素是倒数第三个元素
      p2 = p1 + 1
      p3 = len(nums) - 1
      while p2 < p3:
          if nums[p3] + nums[p2] > nums[p1]:
              res += p3 - p2
              p2 += 1 # 将p2减小 指针往右移动 继续试探
          else:
              p3 -= 1 # 变大p3  指针往左移动 继续试探
  print(res)
  return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值