我们观察到一个由int值n和两个list A和B解释的特定数据样本,其中两个列表包含从1到n的整数元素,并且每个列表中的元素不会重复。(不过,这两个列表中可能有相同的元素。)
n表示在A中观察到的sample.3.A=[2,3],那么结果样本的大小将是B中的A=[2,3],表示“放回”示例中的数字。得到的样本的最大大小不能超过n.A中有一个元素等于B中的元素,或者比B中的元素少一个或更大时,B中的元素才能返回。例如,如果是B.4,因为A中有一个元素比n=5, A=[2,3], B=[4]中的元素少一个-- B中的元素只有在‘放回’的情况下才被考虑一次。如果4.,即使B中的元素满足条件两次,结果样本的大小仍然是n=5, A=[2,3,5], B=[3,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中的元素一旦放回原处就不能考虑。我是否可以对我的代码进行任何编辑,如何最优地解决这个问题?
发布于 2021-05-06 06:05:51
我猜关键是使用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)https://stackoverflow.com/questions/67379230
复制相似问题