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 循环了...
1
Itoktsnhc 2022-08-22 10:47:14 +08:00
呃 这是《三数之和》吗
|
3
fkdtz 2022-08-22 10:58:39 +08:00
我先努力优雅的读懂这个题
|
4
JasonLaw 2022-08-22 10:59:01 +08:00 via iPhone
我不太理解“ 已知 a + b + c = 16”,a 、b 、c 不是数组吗?
|
6
singerll 2022-08-22 11:07:33 +08:00
题干里面是等于还是属于。。。
如果是属于,b+c=16-a ,先列举 a 的值,再确定 b+c 的数组边界,然后在边界里面循环吧。比如 1+1+1 的组合,是不需要循环的。 |
7
brucmao 2022-08-22 11:14:55 +08:00
|
8
lyang 2022-08-22 11:21:26 +08:00
思考的时间,代码已经写完了,for 循环还好吧
|
9
kiroter 2022-08-22 11:22:42 +08:00 2
先遍历 a,b 相加得 ab, 在转 map ,遍历 c, key = 16-3, ab.get(key)
|
10
kiroter 2022-08-22 11:22:57 +08:00
key=16-c
|
11
FYFX 2022-08-22 11:38:30 +08:00
你给的这个例子就这个数据量为什么不循环,还是说这只是题目中的一个测试用例?
|
12
BeautifulSoap 2022-08-22 11:49:13 +08:00 via Android
9 楼思路对的,把 a 和 b 相加然后用 16 一个个去减,结果到 c 里找,存在的话就是对应的组合只需要 8x8+64 次计算,比穷举的 8x8x8 好
可问题在于上面说的,总共就这么小的数组,直接穷举也没问题 |
13
Gawain OP |
14
cccjh 2022-08-22 11:51:39 +08:00 3
|
15
Gawain OP @FYFX
@BeautifulSoap 实际问题虽然不是这么小的数组,但是也多大,确实可以循环穷举。 但是总觉得这样不够优雅 在想是不是有别的数学方法 比如用 nump 数组操作之类的 但是这方面的知识早就忘光了 总之,穷举完全没问题,就是抱着学习的态度,问问有没有别的方法 |
17
ji39 2022-08-22 13:05:32 +08:00
能不能用心算
|
19
wxf666 2022-08-22 13:59:44 +08:00 1
这样?我没测试过
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') |
20
Jooooooooo 2022-08-22 14:35:18 +08:00
你搜下 three sum leetcode.
这题当然暴力解是可以的, 不过有更好的方法. |
21
fkdtz 2022-08-22 15:09:41 +08:00
three sum 乃至于 n sum 问题
|
22
wangtian2020 2022-08-22 15:39:00 +08:00
选择内存最小方案 ×
选择运行时间最短方案 × 考虑到循环总次数尚可接受,选择不用动脑自己写的最快的 for 循环方案 √ |
23
Gawain OP |
24
UIXX 2022-08-22 17:02:21 +08:00
比较同意循环方案,省脑。
实际上,从几何的角度看,就是一个求平面上格点的问题。由于公式的特殊性(整个平面的倾斜角为 45 度),以及数值的特殊性(和为偶数),这些格点并不需要计算,可以被直接列出来。复杂度等同于输出规模。 和为奇数的情况也差不多。 如果公式变了(平面倾斜度不再是 45 度,甚至不再是平面),那代数法更好。 |