【问题标题】:How to increase efficiency of comparing elements of a list?如何提高比较列表元素的效率?
【发布时间】:2020-01-30 03:20:09
【问题描述】:

每当我在在线平台上编码时,我必须以某种方式将列表中的元素相互比较,我会使用下面的代码,这对我来说是最有效的。这是我练习的最后一个代码。就是找到两个相同元素之间的最大索引。

max=0
for i in range(len(mylist)):
    if max==(len(mylist)-1):
        break
    for j in range(i + 1, len(mylist)):
        if mylist[i] == mylist[j]:
            if max>(abs(i-j)):
                max=abs(i-j)

它运行大多数测试用例,但有时会显示“超出时间限制”。我知道这与约束和时间复杂度有关,但我仍然找不到更好的方法。如果有人可以帮助我,那就太好了。

【问题讨论】:

  • 如果我们知道#do something,我想我们可以省略内部循环。例如,如果它是对一个列表的逐元素操作,我们可以删除第二个循环。我认为这取决于第二个循环的主体。请提供更多信息。
  • 您能分享问题文本(或URL)吗? 做某事很重要。作为提示,您可以使用collections.Counter
  • 在所有情况下都知道i > j 时使用abs(i-j) 似乎很奇怪。为什么不直接使用j-i,并消除对abs 的调用?

标签: python list data-structures constraints time-complexity


【解决方案1】:

在 Python 中使用基于 C 的函数更容易。也不要命名变量 python 类型,如list

x = [item for i, item in enumerate(l) if item in l[i+1:]]
# do something with list of values

【讨论】:

    【解决方案2】:

    你可以按相等的元素分组,然后在组内找到差异,并保持最大值:

    lst = [1, 3, 5, 3, 7, 8, 9, 1]
    
    groups = {}
    for i, v in enumerate(lst):
        groups.setdefault(v, []).append(i)
    
    result = max(max(group) - min(group) for group in groups.values())
    
    print(result)
    

    输出

    7
    

    这种方法的复杂性是O(n)

    【讨论】:

      【解决方案3】:
      def get_longest_distance_between_same_elements_in_list(mylist):
      
          positions = dict()
          longest_distance = 0
      
          if len(mylist) < 1:
              return longest_distance
      
          for index in range(0, len(mylist)):
              if mylist[index] in positions:
                  positions[mylist[index]].append(index)
              else:
                  positions[mylist[index]] = [index]
      
          for key, value in positions.items():
              if len(value) > 1 and longest_distance < value[len(value)-1] - value[0]:
                  longest_distance = value[len(value)-1] - value[0]
      
          return longest_distance
      
      
      l1 = [1, 3, 5, 3, 7, 8, 9, 1]
      l2 = [9]
      l3 = []
      l4 = [4, 4, 4, 4, 4]
      l5 = [10, 10, 3, 4, 5, 4, 10, 56, 4]
      print(get_longest_distance_between_same_elements_in_list(l1))
      print(get_longest_distance_between_same_elements_in_list(l2))
      print(get_longest_distance_between_same_elements_in_list(l3))
      print(get_longest_distance_between_same_elements_in_list(l4))
      print(get_longest_distance_between_same_elements_in_list(l5))
      

      输出 -

      7                                                                                                                                                                                  
      0                                                                                                                                                                                  
      0                                                                                                                                                                                  
      4                                                                                                                                                                                  
      6
      

      时间复杂度:O(n)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 2011-06-23
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多