如何优雅的解这个题?

2022-08-22 10:44:22 +08:00
 Gawain

a=[1,2,3,4,5,6,7,8]

b=[1,2,3,4,5,6,7,8]

b=[1,2,3,4,5,6,7,8]

已知 a + b + c = 16

求全部 abc 的组合

线性代数还是数组啥的,都还给老师了,只会 for 循环了...

4250 次点击
所在节点    Python
25 条回复
Itoktsnhc
2022-08-22 10:47:14 +08:00
呃 这是《三数之和》吗
Itoktsnhc
2022-08-22 10:48:51 +08:00
@Itoktsnhc
如果是三数之和, 一般是做好排序,在循环中固定其中一个值,然后左右两侧指针遍历才能保证单调性。
fkdtz
2022-08-22 10:58:39 +08:00
我先努力优雅的读懂这个题
JasonLaw
2022-08-22 10:59:01 +08:00
我不太理解“ 已知 a + b + c = 16”,a 、b 、c 不是数组吗?
JasonLaw
2022-08-22 10:59:20 +08:00
@fkdtz #3 me too
singerll
2022-08-22 11:07:33 +08:00
题干里面是等于还是属于。。。
如果是属于,b+c=16-a ,先列举 a 的值,再确定 b+c 的数组边界,然后在边界里面循环吧。比如 1+1+1 的组合,是不需要循环的。
brucmao
2022-08-22 11:14:55 +08:00
lyang
2022-08-22 11:21:26 +08:00
思考的时间,代码已经写完了,for 循环还好吧
kiroter
2022-08-22 11:22:42 +08:00
先遍历 a,b 相加得 ab, 在转 map ,遍历 c, key = 16-3, ab.get(key)
kiroter
2022-08-22 11:22:57 +08:00
key=16-c
FYFX
2022-08-22 11:38:30 +08:00
你给的这个例子就这个数据量为什么不循环,还是说这只是题目中的一个测试用例?
BeautifulSoap
2022-08-22 11:49:13 +08:00
9 楼思路对的,把 a 和 b 相加然后用 16 一个个去减,结果到 c 里找,存在的话就是对应的组合只需要 8x8+64 次计算,比穷举的 8x8x8 好

可问题在于上面说的,总共就这么小的数组,直接穷举也没问题
Gawain
2022-08-22 11:51:20 +08:00
@JasonLaw
@fkdtz
@singerll

我的错,应该 a b c 属于三个数组,是其中之一,相找这样的组合
cccjh
2022-08-22 11:51:39 +08:00
以前大学高数满分,现在只会普通思维了

https://gist.github.com/chen-jia-hao/94a1fbfecd402e838496a0331d65fa52
Gawain
2022-08-22 11:55:07 +08:00
@FYFX
@BeautifulSoap

实际问题虽然不是这么小的数组,但是也多大,确实可以循环穷举。

但是总觉得这样不够优雅

在想是不是有别的数学方法 比如用 nump 数组操作之类的 但是这方面的知识早就忘光了

总之,穷举完全没问题,就是抱着学习的态度,问问有没有别的方法
Gawain
2022-08-22 11:57:32 +08:00
@cccjh

非常感谢
ji39
2022-08-22 13:05:32 +08:00
能不能用心算
wangyzj
2022-08-22 13:17:08 +08:00
@cccjh #14 我就喜欢这样的直给
wxf666
2022-08-22 13:59:44 +08:00
这样?我没测试过


from bisect import bisect_left, bisect_right

a = set([1, 2, 3, 4, 5, 6, 7, 8])
b = sorted([1, 2, 3, 4, 5, 6, 7, 8])
c = set([1, 2, 3, 4, 5, 6, 7, 8])

for x in a:
  for i in range(bisect_left(b, 16 - x - max(c)), bisect_right(b, 16 - x - min(c))):
   print(f'{x} + {b[i]} + {16 - x - b[i]} = 16')
Jooooooooo
2022-08-22 14:35:18 +08:00
你搜下 three sum leetcode.

这题当然暴力解是可以的, 不过有更好的方法.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/874486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX