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

在Python的两个列表中使用贪婪算法,python,list,greedy,Python,List,Greedy,我们观察一个特定的数据样本,该样本由一个int值n和两个列表a和B解释,其中两个列表包含整数元素或从1到n的元素,并且每个列表中的元素不重复。(但是,两个列表中可能有相同的元素。) n表示观察样本的大小 A中的元素表示从样本中“取出”的数字。因此,如果n=5和A=[2,3],我们得到的样本大小将是3 B中的元素表示“放回”样本中的数字。结果样本的最大大小不能超过n 但是,只有当且仅当A中有一个元素等于B中的元素,或者小于或大于B中的元素时,B中的元素才能放回中。例如,如果n=5,A=[2,3]

我们观察一个特定的数据样本,该样本由一个int值
n
和两个列表
a
B
解释,其中两个列表包含整数元素或从
1
n
的元素,并且每个列表中的元素不重复。(但是,两个列表中可能有相同的元素。)

  • n
    表示观察样本的大小
  • A
    中的元素表示从样本中“取出”的数字。因此,如果
    n=5
    A=[2,3]
    ,我们得到的样本大小将是
    3
  • B
    中的元素表示“放回”样本中的数字。结果样本的最大大小不能超过
    n
  • 但是,只有当且仅当
    A
    中有一个元素等于
    B
    中的元素,或者小于或大于
    B
    中的元素时,
    B
    中的元素才能放回
    中。例如,如果
    n=5,A=[2,3],B=[4]
    ,我们的样本大小将是
    4
    ,因为
    A
    中存在一个元素,它比
    B
    中的元素小一个
  • 最后,
    B
    中的元素只有在“放回”时才会考虑一次。如果
    n=5,A=[2,3,5],B=[3,4]
    ,即使
    B
    中的元素满足条件各两次,结果样本的大小仍然是
    4
给出了一些测试用例:

n   A       B           return
5   [2, 4]  [1, 3, 5]   5
5   [2, 4]  [3]         4
3   [3]     [1]         2
我知道这是一种贪婪算法(我不太熟悉),但我也尝试了以下方法:

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
中的元素一旦被放回后就不能被考虑。我是否可以对代码进行任何编辑,以及如何最佳地解决这个问题?

我想关键是使用
set()
,以便首先检索集合而不包含任何重叠的元素,然后开始删除经过的元素(这与我的初始代码类似)

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)