题目
给你一个包含 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
就是上面的那份代码。
拓展
list2 = list1.copy()
不等于list2 = list1
,前者是创建新的变量list2,开辟了新的储存空间,后者是list1和list2为同一变量,同一储存空间。- 一维数组排序,按照列表中所有元素进行升降序排序;二维数组排序,按照列表中所有数组的第一个下标的元素比较进行排序。