zoukankan      html  css  js  c++  java
  • LeetCode Notes_#15 3Sum

    LeetCode Notes_#15 3Sum

    Contents

    题目

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    triplets=>triple lets三胞胎,这里是三元组的意思

    Note:

    The solution set must not contain duplicate triplets.

    Example:

    Given array nums = [-1, 0, 1, 2, -1, -4],

    A solution set is:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    思路和解答

    思路

    • 第一想法:好像就只能暴力循环这样去加?
    • 还可以这样,先加两个数得到一个sum,然后找有没有sum的相反数?(而且这个相反数不能是两个数之一)
    • 疑问:每一个三元素list里边的数字有顺序要求吗?

    解答

    #尝试暴力循环
    class Solution(object):
        def threeSum(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            res=[]
            for i in range(len(nums)):
                for j in range(i+1,len(nums)):
                    for k in range(j+1,len(nums)):
                        if nums[i]+nums[k]+nums[j]==0:
                            res.append([nums[i],nums[j],nums[k]])
            return res
    

    逻辑没有问题,但是结果的细节有点出入,就是会出现两次元素相同的三元组,那么需要再处理一下,每个三元list内部排一下序,然后先加入set,避免重复,最后转化为list并返回

    #尝试第二次
    class Solution(object):
        def threeSum(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            resSet={}
            res=[]
            for i in range(len(nums)):
                for j in range(i+1,len(nums)):
                    for k in range(j+1,len(nums)):
                        if nums[i]+nums[k]+nums[j]==0:
                            resElement=[nums[i],nums[j],nums[k]]
                            resElement.sort()
                            if resElement not in res:
                                res.append(resElement)
            # resSet={res}
            # res=list(resSet)
            return res
    

    改了一下,答案肯定没错了,但是暴力循环再次超时,

    #最后的解答还是照着discussion敲的,emmm
    class Solution(object):
        def threeSum(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            res=[]
            nums.sort()
            for i in range(len(nums)-2):#因为找的是三个数,所以不能遍历到最后,要提前结束
                if i>0 and nums[i]==nums[i-1]:#先固定一个数nums[i],再去找另两个数,固定的这个数只需要一次就可以了,重复的就跳过
                    continue
                l,r=i+1,len(nums)-1#左右指针
                while(l<r):
                    s=nums[i]+nums[l]+nums[r]
                    if s<0:#如果结果小了,那么将他调整大一点
                        l+=1
                    elif s>0:#如果结果大了,那么将他调整小一点
                        r-=1
                    else:
                        res.append((nums[i],nums[l],nums[r]))#插入到res最后
                        while l<r and nums[l]==nums[l+1]:#两个while语句用来快速移动指针,直到没有出现相邻重复数字
                            l+=1
                        while l<r and nums[r]==nums[r-1]:
                            r-=1
                        l+=1#如果s=0了,也要继续移动指针
                        r-=1
            return res
    

    这大概是目前为止做到的比较复杂的一道题了,之前的套路不太管用...

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/Howfars/p/9931661.html
Copyright © 2011-2022 走看看