【问题标题】:Two sums Leetcode python两个总和 Leetcode python
【发布时间】:2021-06-16 23:38:52
【问题描述】:

我最近开始使用 Python 进行编码。如果有人能回答我的问题,我将不胜感激。谢谢。

给定一个整数数组 nums 和一个整数目标,返回两个数字的索引,使它们加起来等于目标。 例子: 输入:nums = [2,7,11,15],目标 = 9 输出:[0,1]

这是我的代码:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            j=i+1
            while j<len(nums):
                if nums[i] + nums[j] == target:
                    print(i,j)                    
                else:
                    i=i+1

我得到的输出: 超出输出限制 0 1 0 1 0 1........

谁能告诉我代码有什么问题?我知道我们可以使用 enumerate 和 do。但我想知道“超出输出限制”的原因

谢谢

【问题讨论】:

    标签: python-3.x list


    【解决方案1】:

    您的代码很慢,因为您有嵌套循环(forwhile)。所以对于大的输入,你会得到 TimeOut 错误。

    尝试将nums 转换为字典,其中键是数字和值索引。这样,您可以在 O(1) 时间内检查您是否有第二个数字:

    nums = [2, 7, 11, 15]
    target = 9
    
    nums = {v: i for i, v in enumerate(nums)}
    for val, i in nums.items():
        if target - val in nums:
            print(i, nums[target - val])
            break
    

    打印:

    0 1
    

    【讨论】:

      【解决方案2】:

      其他答案指出了可能导致超出时间限制错误的其他性能问题以及如何解决它们(在此过程中,通过副作用解决您的实际问题),但错过了导致您观察到的输出的问题超出限制错误。想我会解释实际的问题,这样你就知道如果你再次看到它意味着什么。

      你的最后一行是i=i+1,而你几乎肯定是指j=j+1。由于您永远不会更改j,因此while 循环要么永远不会运行(当len(nums) == 1),要么永远运行(len(nums) &gt; 1)。当然,由于您确实更改了i,最终i 超过了nums 的合法索引,并且您的代码以IndexError 终止。 IndexError 的回溯几乎肯定比为这样一个简单问题定义的输出限制要长,从而导致您看到的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        • 2020-04-16
        • 2021-12-29
        相关资源
        最近更新 更多