4sum 超出时间限制(leetcode)

时间:2021-07-16 15:03:44

标签: python python-3.x list combinations itertools

这是我遇到的问题,问题是从长度为 N 的数组 nums 中找出长度为 4 的可能组合,其总和必须等于给定的目标。

[-497,-480,-477,-470,-452,-448,-440,-412,-390,-381,-372,-372,-369,-366,-355,-346,-340,-337,-322,-321,-311,-296,-258,-249,-248,-232,-215,-199,-174,-154,-128,-122,-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

这是最后执行的测试用例。

1 个答案:

答案 0 :(得分:0)

除了选择一个非常低效的算法之外,您的实现还存在一些效率问题:

  • 无需将 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