鱼C论坛

 找回密码
 立即注册
查看: 2657|回复: 15

[已解决]Python:【新】每日一题 1

[复制链接]
发表于 2021-3-17 19:32:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

专辑说明

今天的题目:


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

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

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

示例 1:

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

输入:nums = [], target = 0
输出:[]

欢迎大家来答题


来源:力扣(LeetCode)
最佳答案
2021-3-18 15:44:56
  1. def test(nums, target):
  2.     t = []
  3.     length = len(nums)
  4.     if length < 4:
  5.         print('error nums')
  6.         return t

  7.     nums.sort()

  8.     for i in range(length-3):
  9.         if i > 0 and nums[i] == nums[i-1]:
  10.             continue
  11.         for j in range(i+1, length-2):
  12.             if j > i+1 and nums[j] == nums[j-1]:
  13.                 continue
  14.             left = j+1
  15.             right = length-1
  16.             while left < right:
  17.                 sum = nums[i] + nums[j] + nums[left] + nums[right]
  18.                 if target == sum:
  19.                     t.append([nums[i],nums[j],nums[left],nums[right]])

  20.                     while left < right and nums[left] == nums[left+1]:
  21.                         left+=1
  22.                     while left < right and nums[right] == nums[right-1]:
  23.                         right-=1
  24.                     left+=1
  25.                     right-=1
  26.                 elif target < sum:
  27.                     right-=1
  28.                 else:
  29.                     left+=1
  30.     return t

  31. nums = [3, -1, 4, -3, -2, 1, 2, -4]
  32. target = 0
  33. list1 = test(nums, target)
  34. print(list1)
复制代码


测试结果
  1. [[-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]]
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-17 20:06:38 | 显示全部楼层
挺难的……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-17 20:25:56 | 显示全部楼层
我认输
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 20:43:43 | 显示全部楼层

下次会简单一点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-17 20:52:00 | 显示全部楼层
  1. def s(nums,target):
  2.     nums=sorted(nums)
  3.     L=[]
  4.     for i in range(len(nums)-3):
  5.         for j in range(i+1,len(nums)-2):
  6.             for k in range(j+1,len(nums)-1):
  7.                 for l in range(k+1,len(nums)):
  8.                     if nums[i]+nums[j]+nums[k]+nums[l]==target and [nums[i],nums[j],nums[k],nums[l]] not in L:
  9.                         L.append([nums[i],nums[j],nums[k],nums[l]])
  10.     return L
  11. L=s([1,0,-1,0,-2,2],0)
  12. print(L)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-17 21:52:41 | 显示全部楼层


输入
[91277418,66271374,38763793,4092006,11415077,60468277,1122637,72398035,-62267800,22082642,60359529,-16540633,92671879,-64462734,-55855043,-40899846,88007957,-57387813,-49552230,-96789394,18318594,-3246760,-44346548,-21370279,42493875,25185969,83216261,-70078020,-53687927,-76072023,-65863359,-61708176,-29175835,85675811,-80575807,-92211746,44755622,-23368379,23619674,-749263,-40707953,-68966953,72694581,-52328726,-78618474,40958224,-2921736,-55902268,-74278762,63342010,29076029,58781716,56045007,-67966567,-79405127,-45778231,-47167435,1586413,-58822903,-51277270,87348634,-86955956,-47418266,74884315,-36952674,-29067969,-98812826,-44893101,-22516153,-34522513,34091871,-79583480,47562301,6154068,87601405,-48859327,-2183204,17736781,31189878,-23814871,-35880166,39204002,93248899,-42067196,-49473145,-75235452,-61923200,64824322,-88505198,20903451,-80926102,56089387,-58094433,37743524,-71480010,-14975982,19473982,47085913,-90793462,-33520678,70775566,-76347995,-16091435,94700640,17183454,85735982,90399615,-86251609,-68167910,-95327478,90586275,-99524469,16999817,27815883,-88279865,53092631,75125438,44270568,-23129316,-846252,-59608044,90938699,80923976,3534451,6218186,41256179,-9165388,-11897463,92423776,-38991231,-6082654,92275443,74040861,77457712,-80549965,-42515693,69918944,-95198414,15677446,-52451179,-50111167,-23732840,39520751,-90474508,-27860023,65164540,26582346,-20183515,99018741,-2826130,-28461563,-24759460,-83828963,-1739800,71207113,26434787,52931083,-33111208,38314304,-29429107,-5567826,-5149750,9582750,85289753,75490866,-93202942,-85974081,7365682,-42953023,21825824,68329208,-87994788,3460985,18744871,-49724457,-12982362,-47800372,39958829,-95981751,-71017359,-18397211,27941418,-34699076,74174334,96928957,44328607,49293516,-39034828,5945763,-47046163,10986423,63478877,30677010,-21202664,-86235407,3164123,8956697,-9003909,-18929014,-73824245]
-236727523
超出时间限制
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-17 22:02:14 | 显示全部楼层
Python每日一题由你来承担了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-17 22:07:43 | 显示全部楼层
liuzhengyuan 发表于 2021-3-17 21:52
输入
超出时间限制

再次认输

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2 谢谢参与

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 。


  1. nums[i] + nums[i+1] + nums[i+2] + nums[i+3] >  target
  2. nums[i] + nums[j] + nums[j-1] + nums[j-2] >  target
复制代码


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

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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
liuzhengyuan + 3 + 3 思路很好

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-18 15:44:56 | 显示全部楼层    本楼为最佳答案   
  1. def test(nums, target):
  2.     t = []
  3.     length = len(nums)
  4.     if length < 4:
  5.         print('error nums')
  6.         return t

  7.     nums.sort()

  8.     for i in range(length-3):
  9.         if i > 0 and nums[i] == nums[i-1]:
  10.             continue
  11.         for j in range(i+1, length-2):
  12.             if j > i+1 and nums[j] == nums[j-1]:
  13.                 continue
  14.             left = j+1
  15.             right = length-1
  16.             while left < right:
  17.                 sum = nums[i] + nums[j] + nums[left] + nums[right]
  18.                 if target == sum:
  19.                     t.append([nums[i],nums[j],nums[left],nums[right]])

  20.                     while left < right and nums[left] == nums[left+1]:
  21.                         left+=1
  22.                     while left < right and nums[right] == nums[right-1]:
  23.                         right-=1
  24.                     left+=1
  25.                     right-=1
  26.                 elif target < sum:
  27.                     right-=1
  28.                 else:
  29.                     left+=1
  30.     return t

  31. nums = [3, -1, 4, -3, -2, 1, 2, -4]
  32. target = 0
  33. list1 = test(nums, target)
  34. print(list1)
复制代码


测试结果
  1. [[-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]]
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-18 15:58:48 | 显示全部楼层
高手啊。学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-18 17:26:48 | 显示全部楼层

616ms,通过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-18 19:59:02 | 显示全部楼层
好难啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-19 16:21:56 | 显示全部楼层
---------------已结帖--------------------之后的回答不会有积分奖励
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 19:18:07 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2021-3-19 19:29 编辑

随便写写,没有考虑优化,纯粹穷举。
写个递归
  1. def main(nums, target):
  2.     result = []
  3.     def digui(nums: list, target: int, m, candi: list = [[]]):
  4.         if m == 1:
  5.             for i in nums:
  6.                 for each in candi:
  7.                     if i+sum(each) == target:
  8.                         output = sorted(each+[i])
  9.                         if output not in result:
  10.                             result.append(output)
  11.         else:
  12.             for i in range(len(nums)):
  13.                 new_nums = nums.copy()
  14.                 new_nums.pop(i)
  15.                 new_candi = []
  16.                 for each in candi:
  17.                     if nums[i]+sum(each)<=target:
  18.                         new_candi.append(each+[nums[i]])
  19.                 digui(new_nums, target, m-1, new_candi)
  20.     digui(nums, target, 4)
  21.     result.sort()
  22.     return result

  23. print(main([3, -1, 4, -3, -2, 1, 2, -4], 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]]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 08:28:42 | 显示全部楼层
  1. def find(List,target):
  2.     l = len(List)
  3.     if l < 4:
  4.         return False
  5.     res = []
  6.     for a in range(l):
  7.         for b in range(a + 1,l):
  8.             for c in range(b + 1,l):
  9.                 for d in range(c + 1,l):
  10.                     if List[a] + List[b] + List[c] + List[d] == target:
  11.                         res.append([List[a],List[b],List[c],List[d]])
  12.     return res

  13. print(find([3, -1, 4, -3, -2, 1, 2, -4],0))
  14. print("-" * 8)
  15. print(find([3, -1, 4, -3, -2, 1, 2, -4],1))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表