LeetCode -- 15. 三数之和 & shopee2020春招开发岗编程题(Python)

题目

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组
注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解题思路

利用LeetCode – 167.两数之和 II - 输入有序数组的思想。在两数之和中,对一个有序数组,数组中元素a和b满足,a + b = target。对于三数之和,a + b + c = 0,若把 -c = target,就可以用两数之和的做法,即a + b = -c。

  • 先把数组nums排序,由于三元组不能重复,故新建集合res
  • 遍历排序好的数组,选出下标为i的一个数作为target,当左下标小于右下标时,然后用左下标的数加右下标的数,看其值是否等于target;
    *如果 等于的话就把三个下标按顺序放入集合res中,然后左下标+1,右下标-1;
  • 如果小于的话就让左边的数变大,即左下标+1;
  • 如果大于的话就让右边的数变小,即右下标-1;
  • 直到遍历完数组,把集合res列表化,返回答案二维数组ans

代码提交

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        res = set()
        for i in range(len(nums)-1):
            left = i + 1
            right = len(nums) - 1
            while left < right:
                if nums[left] + nums[right] == -1*nums[i]:
                    res.add((nums[i], nums[left], nums[right]))
                    left += 1
                    right -= 1
                elif nums[left] + nums[right] < -1*nums[i]:
                    left += 1
                else:
                    right -= 1
        ans = []
        for item in res:
            ans.append(list(item))
        return ans

执行用时 :2116 ms, 在所有 Python3 提交中击败了5.05%的用户
内存消耗 :17.2 MB, 在所有 Python3 提交中击败了6.02%的用户

shopee2020春招开发岗编程题

题目

输入描述:
在一行内输入一个数组,每个数字间以逗号分隔,示例:
1,0,-2,1,3,-1,2,-1
输出描述:
把每个组合以[a,b,c]的形式输出,每个组合之间以逗号分隔。
并要求:
1. 组合内的数字是升序;
2. 每个组合之间,按照以a,b,c从高到低的优先级进行升序。
示例:
[-2,-1,3],[-2,0,2],[-2,1,1],[-1,-1,2],[-1,0,1]

题目分析

从题目的要求上看,就是LeetCode上三数之和的要求,只是两题的输出形式不一样,因此可以用上面提交的代码解决。

代码

题解1
之前用过暴力解法,思路为:

  • 先找出符合的组合形成二维数组new_list1
  • 对new_list1中组合内的元素进行升序排序
  • 再对new_list1去重形成二维数组new_list2
  • 最后对new_list2进行二维数组升序排序

然后这个代码用在LeetCode的三数之和中因为用时过长不通过,下面还是粘贴出来记录一下:

def findListSumEqual_0(nums):
    new_list1 = []
    new_list2 = []
    length = len(nums)
    times = 0
    while times < length:
        for x in nums:
            ls1 = nums.copy()
            ls1.remove(x)
            for y in ls1:
                ls2 = ls1.copy()
                ls2.remove(y)
                for z in ls2:
                    if x + y + z == 0:
						# 将和为0的三个元素以数组的形式添加到数组列表中
                        new_list1.append([x, y, z]) 
            times += 1
    for ls in new_list1:
        ls.sort()  
    for item in new_list1:
        if item not in new_list2:
            new_list2.append(item)
    new_list2.sort()
    return new_list2

题解2
就是上面的那份代码。

拓展

  1. list2 = list1.copy() 不等于 list2 = list1,前者是创建新的变量list2,开辟了新的储存空间,后者是list1和list2为同一变量,同一储存空间。
  2. 一维数组排序,按照列表中所有元素进行升降序排序;二维数组排序,按照列表中所有数组的第一个下标的元素比较进行排序。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值