如何解决在 Python 中的两个列表中使用贪心算法
我们观察由一个整数值 n
和两个列表 A
和 B
解释的特定数据样本,其中两个列表包含整数元素或范围从 1
到 n
,并且每个列表中的元素不重复。 (但是,两个列表中可能有相同的元素。)
-
n
表示观察样本的大小。 -
A
中的元素表示从样本中“取出”的数字。因此,如果n=5
和A=[2,3]
,我们得到的样本的大小将是3
。 -
B
中的元素表示“放回”样本中的数字。生成的样本的最大大小不能超过n
。 - 然而,只有当且仅当
B
中的元素等于A
中的元素或少一个时,才能将B
中的元素放回或大于B
中的元素。例如,如果n=5,A=[2,3],B=[4]
,我们的样本大小将为4
,因为A
中存在一个元素比B
中的元素小 1。立> - 最后,如果
B
中的元素被“放回”,它们只会被考虑一次。如果n=5,3,5],B=[3,4]
,即使B
中的元素各满足两次条件,结果样本的大小仍为4
。
给出了一些测试用例:
n A B return
5 [2,4] [1,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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。