liuzhengyuan 发表于 2021-3-17 19:32:51

Python:【新】每日一题 1

本帖最后由 liuzhengyuan 于 2021-3-17 19:37 编辑

专辑说明

今天的题目:

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:答案中不可以包含重复的四元组。

请封装成一个函数,nums 和 target 为函数参数

示例 1:

输入:nums = , target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:

输入:nums = [], target = 0
输出:[]
欢迎大家来答题{:10_298:}


来源:力扣(LeetCode)

liuzhengyuan 发表于 2021-3-17 20:06:38

挺难的……{:10_245:}

洋洋痒 发表于 2021-3-17 20:25:56

我认输

liuzhengyuan 发表于 2021-3-17 20:43:43

洋洋痒 发表于 2021-3-17 20:25
我认输

下次会简单一点

洋洋痒 发表于 2021-3-17 20:52:00

def s(nums,target):
    nums=sorted(nums)
    L=[]
    for i in range(len(nums)-3):
      for j in range(i+1,len(nums)-2):
            for k in range(j+1,len(nums)-1):
                for l in range(k+1,len(nums)):
                  if nums+nums+nums+nums==target and ,nums,nums,nums] not in L:
                        L.append(,nums,nums,nums])
    return L
L=s(,0)
print(L)

liuzhengyuan 发表于 2021-3-17 21:52:41

洋洋痒 发表于 2021-3-17 20:52


{:10_245:}输入

-236727523超出时间限制

yayc_zcyd 发表于 2021-3-17 22:02:14

Python每日一题由你来承担了{:10_257:}

洋洋痒 发表于 2021-3-17 22:07:43

liuzhengyuan 发表于 2021-3-17 21:52
输入
超出时间限制

再次认输{:10_297:}

Stubborn 发表于 2021-3-18 00:27:45

本帖最后由 Stubborn 于 2021-3-18 00:41 编辑

我们先对nums进行排序, 首先确定几个思想。

1.当我们确定第一个数 a1 之后,若 a1 之后的三个数之和大于 target 。 那么 a1 之后的所有组合,都会大于target 。
同理当我们确定第一个数 a1 之后,,若 a1 与nums的末尾的三个数之和小鱼于 target 。 那么 a1 之后的所有组合,都会小于target 。


nums + nums + nums + nums >target
nums + nums + nums + nums >target

2.当我们确定两个数 ai aj ,若 aj 之后的两个数之和大于 target 。 那么 ai, aj 之后的所有组合,都会大于target 。
同理,当我们确定两个数 ai aj ,若 ai aj 与 nums 的末尾的两个个数之和小于 target 。 那么 ai aj 之后的所有组合,都会小于target 。

3.最后当我们确定两个数之后,此时我们的问题变成了,从num[ j : n ] 寻找两数之和,使用双指针,或者二分加快效率

crisfo 发表于 2021-3-18 15:44:56

def test(nums, target):
    t = []
    length = len(nums)
    if length < 4:
      print('error nums')
      return t

    nums.sort()

    for i in range(length-3):
      if i > 0 and nums == nums:
            continue
      for j in range(i+1, length-2):
            if j > i+1 and nums == nums:
                continue
            left = j+1
            right = length-1
            while left < right:
                sum = nums + nums + nums + nums
                if target == sum:
                  t.append(,nums,nums,nums])

                  while left < right and nums == nums:
                        left+=1
                  while left < right and nums == nums:
                        right-=1
                  left+=1
                  right-=1
                elif target < sum:
                  right-=1
                else:
                  left+=1
    return t

nums =
target = 0
list1 = test(nums, target)
print(list1)

测试结果
[[-4, -3, 3, 4], [-4, -2, 2, 4], [-4, -1, 1, 4], [-4, -1, 2, 3], [-3, -2, 1, 4], [-3, -2, 2, 3], [-3, -1, 1, 3], [-2, -1, 1, 2]]

sdhmlsq 发表于 2021-3-18 15:58:48

高手啊。学习

liuzhengyuan 发表于 2021-3-18 17:26:48

crisfo 发表于 2021-3-18 15:44
测试结果

616ms,通过

私はり 发表于 2021-3-18 19:59:02

好难啊

liuzhengyuan 发表于 2021-3-19 16:21:56

---------------已结帖--------------------之后的回答不会有积分奖励

jerryxjr1220 发表于 2021-3-19 19:18:07

本帖最后由 jerryxjr1220 于 2021-3-19 19:29 编辑

随便写写,没有考虑优化,纯粹穷举。
写个递归
def main(nums, target):
    result = []
    def digui(nums: list, target: int, m, candi: list = [[]]):
      if m == 1:
            for i in nums:
                for each in candi:
                  if i+sum(each) == target:
                        output = sorted(each+)
                        if output not in result:
                            result.append(output)
      else:
            for i in range(len(nums)):
                new_nums = nums.copy()
                new_nums.pop(i)
                new_candi = []
                for each in candi:
                  if nums+sum(each)<=target:
                        new_candi.append(each+])
                digui(new_nums, target, m-1, new_candi)
    digui(nums, target, 4)
    result.sort()
    return result

print(main(, 0))

[[-4, -3, 3, 4], [-4, -2, 2, 4], [-4, -1, 1, 4], [-4, -1, 2, 3], [-3, -2, 1, 4], [-3, -2, 2, 3], [-3, -1, 1, 3], [-2, -1, 1, 2]]

qq1151985918 发表于 2021-3-20 08:28:42

def find(List,target):
    l = len(List)
    if l < 4:
      return False
    res = []
    for a in range(l):
      for b in range(a + 1,l):
            for c in range(b + 1,l):
                for d in range(c + 1,l):
                  if List + List + List + List == target:
                        res.append(,List,List,List])
    return res

print(find(,0))
print("-" * 8)
print(find(,1))
页: [1]
查看完整版本: Python:【新】每日一题 1