如何优化此python代码以降低时间复杂性

如何优化此python代码以降低时间复杂性,python,list,optimization,Python,List,Optimization,我想解决一个问题 给定两个整数数组,A和B,大小均为n 假设您有一个整数列表,最初为空。现在,对于从1到n的每个i,您将同时遍历2个数组,并执行以下操作: 您将Ai附加到列表中。 如果列表现在至少包含两个不同的元素,您将从列表中删除两个不同的元素。如果列表中有多个Bi distinct元素,您将按列表中的频率从最高频率到最低顺序删除Bi distinct元素,即先删除频率较高的元素。 如果列表中有两个元素具有相同的频率,那么您将删除Ai值较低的元素。 如果可以执行此删除操作,则该操作将被视为成功

我想解决一个问题

给定两个整数数组,A和B,大小均为n

假设您有一个整数列表,最初为空。现在,对于从1到n的每个i,您将同时遍历2个数组,并执行以下操作:

您将Ai附加到列表中。 如果列表现在至少包含两个不同的元素,您将从列表中删除两个不同的元素。如果列表中有多个Bi distinct元素,您将按列表中的频率从最高频率到最低顺序删除Bi distinct元素,即先删除频率较高的元素。 如果列表中有两个元素具有相同的频率,那么您将删除Ai值较低的元素。 如果可以执行此删除操作,则该操作将被视为成功操作,否则将不成功。 请注意,在操作成功的情况下,将为下一个操作获取已更新的列表,其中删除了两个不同的元素

范例

假设

n=4

A=[1,1,2,3]

B=[3,2,3,2]

接近

最初,列表为空。 对于i=1,首先将A1附加到列表中。因此,列表变为[1]。现在,B1=3,也就是说,列表中至少需要3个不同的元素。因此,操作不成功。 对于i=2,首先将A2附加到列表中。因此,列表变为[1,1]。现在,B2=2,也就是说,列表中至少需要2个不同的元素,但是列表只有1个不同的元素。因此,操作不成功。 对于i=3,首先将A3附加到列表中。所以,列表变成了[1,1,2]。现在,B3=3,也就是说,您需要删除列表中至少3个不同的元素,但是列表中有2个不同的元素。因此,操作不成功。 对于i=4,首先将A4附加到列表中。因此,列表变为[1,1,2,3]。现在,B4=2,也就是说,您需要从列表中删除至少2个不同的元素,并且列表有3个不同的元素。因此,手术是成功的。您删除1,因为它在列表中的频率最高,然后我们删除2,因为它的值低于3。因此,更新后的列表是[1,3]。 因此,答案是1,即成功操作的数量

下面是我的代码,适用于小案例。但在更高的情况下,超过了时间限制

T = int(input())# No of test cases
for _ in range(T):
    N = int(input()) # Numbers of Elements in Array
    A = list(map(int,input().split()))
    B = list(map(int,input().split()))
    Lis = [] #New List
    Sucess = 0
    for i in range(N):
        Lis.append(A[i])
        if(len(set(Lis))>=B[i]):
            Lis = sorted(Lis,key=Lis.count,reverse = True)
            Set = []
            for S in Lis:
                if S not in Set:
                    Set.append(S)
                if(len(Set)==B[i]):
                    break
            for K in range(B[i]):
                Lis.remove(Set[K])
            Sucess += 1
    print(Sucess)

如何进一步优化此代码?

您应该研究更适合您所做工作的数据结构和python类型,例如
set
dict
,检查数据中是否有值的复杂性为O(1),并且不需要对每个operation@shevron为了检查列表中的不同元素,我首先使用set。但若我使用set,如何删除列表中的元素。如果我有问题中的列表[3,3,1,2],如果B[i]=2,我必须从列表中删除2个不同的元素,这会使它成为[3,2],如果我把这个集合变成{1,2,3},我怎么能按照这个顺序删除呢?显然你需要更具创造性,或者尝试组合多个数据结构(例如,一个用于保存唯一项目的集合和另一个用于跟踪订单/计数的数据结构),或者尝试使用更复杂和更具体的计数器()@shevron谢谢!!我可以将集合修改为
set=list(dict.fromkeys(Lis))
。除此之外,我还可以对代码进行其他优化吗?我肯定有,但StackOverflow不是这样工作的。发布一个与代码相关的特定问题,你会得到具体的答案。一个通用的“如何优化?”这个问题很难回答——阅读专门的数据结构以及对它们执行某些操作的复杂性,我相信您会找到答案,或者至少会提出更具体的问题。
Input

1
4
1 1 2 3
3 2 3 2

Output

1