【问题标题】:4sum time limit exceeded (leetcode)超过 4sum 时间限制(leetcode)
【发布时间】:2021-07-16 15:03:44
【问题描述】:

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

def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
    from itertools import combinations
    comb=list(itertools.combinations(nums, 4))
    lst=[]
    for i in list(comb):
        i=sorted(i)
        if i not in lst and sum(i)==target:
          lst.append(i)
    return lst
    

我写了上面的代码,但它显示它超过了时间限制,有人可以帮我解决这个问题吗?

[-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

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

【问题讨论】:

  • 您的算法——遍历所有可能的组合并找到有效的组合——效率低下。你需要为每个列表遍历nC4 组合,这很快就会变大(100C4 是 390 万)。练习的重点是提出一个有效的算法。如果您遇到困难,请寻找一些解释更有效算法如何工作的教程。这是一个:geeksforgeeks.org/…
  • 预期结果是空列表吗?由于案例中最大值为497,所以无法达到8377。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2022-07-16
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多