问题描述
这是我遇到的问题,问题是从长度为 N 的数组 nums 中找出长度为 4 的可能组合,其总和必须等于给定的目标。
[-497,-480,-477,-470,-452,-448,-440,-412,-390,-381,-372,-369,-366,-355,-346,-340,-337,-322,-321,-311,-296,-258,-249,-248,-232,-215,-199,-174,-154,-128,-122,-117,-115,-113,-110,-89,-86,-84,-78,-71,-69,-53,-49,-35,-25,-21,-7,3,7,21,25,30,47,52,81,84,87,91,96,157,161,167,178,184,210,217,228,236,274,277,283,286,290,301,302,341,352,354,361,367,384,390,412,421,458,468,483,484,486,487,490,491]
target: 8377
我写了上面的代码,但它显示它超过了时间限制,有人可以帮我吗?
<select>
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select
这是最后执行的测试用例。
解决方法
除了选择一个非常低效的算法之外,您的实现还存在一些效率问题:
- 无需将
combinations
返回的迭代器转换为列表(您甚至在for
中再次重铸它!):只需使用它,您将节省两个空间和时间 - 无需对
comb
进行排序 - 它的元素已经与输入列表的顺序相同 - 无需测试结果列表中是否已存在有效组合:您只会看到每个组合一次(除非您的输入中有重复值)
试试这个,即使不改变算法,它已经快得多了:
def new_fourSum(self,nums: List[int],target: int) -> List[List[int]]:
from itertools import combinations
lst=[]
for i in itertools.combinations(nums,4):
if sum(i)==target:
lst.append(i)
return lst