【问题标题】:How to add each element in list to another element of same list in less time?如何在更短的时间内将列表中的每个元素添加到同一列表的另一个元素中?
【发布时间】:2020-06-11 13:42:53
【问题描述】:
Input : l1 = [1,2,3,4,5,6]
Output :     [7, 8, 9, 10, 11, 11]

求列表中每对所有元素的最大和。 一般来说,我必须将列表中的每个元素添加到另一个元素(而不是自身)。 下面是我尝试过的代码。我知道这是(n^2) 的复杂性

有没有更好的方法来降低复杂性(可以是时间和空间)?

任何更好的方法(可能使用一些模块或仅使用单个 for 循环)?

list l1 不必在sorted 中。

l2=[]
l3=[]
for i in range(len(l1)):
   for j in range(len(l1)):
      if i!=j:
         l2.append(l1[i]+l1[j])
   l3.append(max(l2))
   l2.clear()



print(l3)
[7, 8, 9, 10, 11, 11]

更新: 在hackerrank中提交了这个解决方案,但在少数情况下它会失败。 失败原因是TimeLimitExceed (TLE)。我认为,由于数量众多,它会失败。

**Constraints:**
n = size_of_list

1<= n <= 4*10^4
1<= l1[i] <= 1024
1<= i <= n
1<= j <= n
j != i

是不是因为time-complexity,上面的sn-p没能处理好这些场景?

【问题讨论】:

    标签: python-3.x list time-complexity complexity-theory space-complexity


    【解决方案1】:

    你可以这样做:

    l1 = [1,2,3,4,5,6]
    l2=[]
    for i in range(len(l1)):
        for j in range(i+1,len(l1)):
                l2.append(l1[i]+l1[j])
    l3=set(l2)
    l2=list(l3)
    print(l2)
    

    输出:

    [3, 4, 5, 6, 7, 8, 9, 10, 11]
    

    在处理列表之前对其进行排序也有帮助。 让我知道我是否犯了任何错误。

    【讨论】:

    • 输出不匹配。而且,您必须添加一个包含所有其他元素的元素(而不是自身。比如说,它不能是 1+1、2+2,3+3 等)
    【解决方案2】:

    您可以在O(n) 中执行此操作。

    基本思想是获取列表中最大元素和第二大元素的索引。然后对于列表中的每个元素,附加元素 + max_element,如果元素不是 max_element。否则,追加 max_element + second_max_element。

    我使用 get_first_second_max_index 来获取最大元素和第二大元素的索引,因为列表中可能存在相同的元素。

    代码应如下所示:

    def get_first_second_max_index(nums):
        if len(nums) < 2:
            return None, None
    
        first_max_index = 0 if nums[0] > nums[1] else 1
        second_max_index = 0 if nums[0] <= nums[1] else 1
    
        for index in range(2, len(nums)):
            if nums[index] > nums[first_max_index]:
                first_max_index, second_max_index = index, first_max_index
            elif nums[index] > nums[second_max_index]:
                second_max_index = index
    
        return (first_max_index, second_max_index)
    
    
    def max_sum_pair(nums):
        res = []
        if len(nums) >= 2:
            first_max_index, second_max_index = get_first_second_max_index(nums)
    
            for index in range(len(nums)):
                if index == first_max_index:
                    res.append(nums[index] + nums[second_max_index])
                else:
                    res.append(nums[index] + nums[first_max_index])
    
        return res
    
    nums = [1,2,3,4,5,6]
    res = max_sum_pair(nums)
    print(res)
    

    【讨论】:

      【解决方案3】:

      首先,我们可以利用排序来发挥我们的优势。 Python 排序方法sortedO(n log n) 时间运行。 (看这个问题:What is the complexity of this python sort method?

      一旦我们的数字被排序,最大和是微不足道的。数字的最大值只是添加到排序列表中最后一个元素的数字,或者,如果数字是最大元素,则为倒数第二个元素。重写你的代码我们可以获得:

      l3 = []
      l1 = sorted(l1)
      
      for i in range(len(l1)):
          if i + 1 == len(l1):
              l3.append(l1[i] + l1[i - 1])
          else:
              l3.append(l1[i] + l1[-1])
      
      print(l3)
      

      我希望这会有所帮助。如果我误解了您的问题,请告诉我。

      【讨论】:

      • Append 只接受一个参数。请检查一下。
      • @StackGuru,你是对的。我的意思是添加这两个元素。我的错!
      • 没问题,我得到了你的方法。好一个。但是列表不能按排序顺序。谢谢你,更新我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2023-01-13
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多