首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python的两个列表中使用贪婪算法

在Python的两个列表中使用贪婪算法
EN

Stack Overflow用户
提问于 2021-05-04 05:22:18
回答 1查看 153关注 0票数 0

我们观察到一个由int值n和两个list AB解释的特定数据样本,其中两个列表包含从1n的整数元素,并且每个列表中的元素不会重复。(不过,这两个列表中可能有相同的元素。)

  • n表示在A中观察到的sample.
  • Elements的大小,表示从样本中“取出”的数字。因此,如果是3.
  • Elements和A=[2,3],那么结果样本的大小将是B中的A=[2,3],表示“放回”示例中的数字。得到的样本的最大大小不能超过n.
  • However,,只有当A中有一个元素等于B中的元素,或者比B中的元素少一个或更大时,B中的元素才能返回。例如,如果是B.
  • Finally,,我们示例的大小将是4,因为A中有一个元素比n=5, A=[2,3], B=[4]中的元素少一个-- B中的元素只有在‘放回’的情况下才被考虑一次。如果4.

,即使B中的元素满足条件两次,结果样本的大小仍然是n=5, A=[2,3,5], B=[3,4]

给出了一些测试用例:

代码语言:javascript
复制
n   A       B           return
5   [2, 4]  [1, 3, 5]   5
5   [2, 4]  [3]         4
3   [3]     [1]         2

我知道这是一种贪婪的算法(我不太熟悉),但我也尝试了以下几点:

代码语言:javascript
复制
def solution(n, A, B):
    count = n - len(A)
    for i in range(len(B)):
        if B[i]-1 in A:
            count += 1
        elif B[i]+1 in A:
            count += 1
        elif B[i] in A:
            count += 1
        else:
            count += 0
    if n > count:
        answer = count
    else:
        answer = n
    return answer

虽然这看起来很有效,但它并没有考虑到B中的元素一旦放回原处就不能考虑。我是否可以对我的代码进行任何编辑,如何最优地解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-06 06:05:51

我猜关键是使用set(),以便首先检索集合而没有任何重叠的元素,然后开始删除已经遍历的元素(这类似于我的初始代码)。

代码语言:javascript
复制
def solution(n, A, B):
  B_uniq = set(B)-set(A)
  A_uniq = set(A)-set(B)
  for i in B_uniq:
    if i-1 in A_uniq:
      A_uniq.remove(i-1)
    elif i+1 in A_uniq:
      A_uniq.remove(i+1)
  return n-len(A_uniq)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67379230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档