题解 | #数组中相加和为0的三元组# python

数组中相加和为0的三元组

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

#

# @param num int整型一维数组 
# @return int整型二维数组
#
# 分析:三个数字相加为0,情况无外乎如下三种:
#     1.数字中本身就有三个0
#     2.数组中有一个0,另外两个数字互为相反数
#     3.三个数字总和为0
#     但是从上述情况出发思考找这样三个数字,似乎不太方便
#     之前我们做过类似的题目,但是题目中是找两个数的和为某一个值的数,此处用0减去第一个数,作为
#     输入,就可以把该问题转化为求两数之和的问题,首先进行排序并借由双指针方法,完成本题的计算
#     排序之后,当所取的第一个值i>=0 时,后边就不会出现满足条件的数了,故可以停止
class Solution:
    def threeSum(self , num ):
        # write code here
        num.sort()
        if num == [] or num[0] > 0:
            return []
        i = 0
        pre = 0
        le = len(num)
        ans = []
        #由于要取三个数字,所以i最大取到倒数第三个就可以,防止越界
        while i < le - 2 and num[i] < 0:
            if num[i] == pre and i < le:
                i += 1
            else:
                target = -num[i]
                j = i + 1    # j 不能等于i,所以也要+1
                k = le - 1   # 这里k的值应为le-1 别忘了
                while j < k:
                    if num[j] + num[k] > target:
                        k -= 1
                    elif num[j] + num[k] < target:
                        j += 1
                    else:
                        ans.append([num[i],num[j],num[k]]) 
                        while j+1 < k and num[j] == num[j+1]:
                            j += 1
                        while j < k-1 and num[k] == num[k-1]:
                            k -= 1
                        k -= 1   #满足情况之后,也需要对指针进行操作
                        j += 1   #否则会出现死循环
                pre = num[i] #由于存在 -1 -1 2 这种可能,所以说要在数组存在的时候,再排除首项相同的情况
                i += 1
        #分析中提到的三个数字都是0的情况,需要额外注意
        if num[i] == 0  and i+2<le and num[i+1] ==0 and num[i+2] == 0:
            ans.append([0,0,0])
        return ans
全部评论

相关推荐

不愿透露姓名的神秘牛友
2024-12-30 18:02
程序员牛肉:1.可以标记一下自己的学校是985,有一些hr可能没想到你这个院校是985的。 2.简历所呈现出来的能力还是有点差的,苍穹外卖+黑马点评。这在java技术域里面也就是刚学三四个月的样子,大厂现在招人少,小厂又更加希望你能直接过来干活。就你简历上呈现出来的能力,确实是有点难找,肉眼可见的不懂技术。 第一个项目中:简单的使用redis也算是亮点嘛?使用jwt,threadlocal也算是亮点?你不就是调了几个包嘛?Nginx作为服务器也能写出来,这不是前端的活嘛? 第二个项目中:分布式锁+mq消息队列+Lua队列。真没啥好问的。属于面试官看一眼就阳痿的简历,没有任何想提问的欲望。 我给你建议是好好的挖一挖这个项目吧,其实苍穹外卖和黑马点评这两个项目很不错了,只不过是太烂大街了导致面试官没啥问的兴趣,所以不太推荐写简历上。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务