当前位置: 首页 > 后端技术 > Python

leetcode1409.使用键查询排列-python

时间:2023-03-26 13:14:59 Python

1409。Querypermutationswithkeys三种解法-暴力类解法:defprocessQueries(self,queries:List[int],m:int)->List[int]:m=min(m,max(queries))p=[i+1foriinrange(m)]ans=[]forxinqueries:i=p.index(x)ans.append(i)x=p.pop(i)p.insert(0,x)returnans解决方案2deque#fromcollectionsimportdequeclass解决方案:defprocessQueries(self,queries:List[int],m:int)->List[int]:d=deque([i+1foriinrange(min(m,max(queries)))])ans=[]forqinqueries:i=d.index(q)ans.append(i)d.remove(q)d.appendleft(q)returnanssolution三树数组转载自:作者:etworker链接:https://leetcode-cn.com/probl...来源:LeetCode版权所有归作者所有。商业转载请联系作者授权,非商业转载请注明出处。Fenwick类:def__init__(self,n):sz=1whilesz<=n:sz*=2self.size=szself.data=[0]*szdefsum(self,i):s=0whilei>0:s+=self.data[i]i-=i&-i返回sdefadd(self,i,x):whileiList[int]:#-因为queries.length<=m,所以使用双倍空格fenw=Fenwick(2*m)#-vimap保持值i的位置vimap={}foriinrange(1,m+1):fenw.add(i+m,1)vimap[i]=i+m#-下一个头部位置cur=mans=[]forqinqueries:#-获取值q的当前位置i=vimap.pop(q)#-rank表示索引rank=fenw.sum(i-1)ans.append(rank)#-将q移动到头部位置vimap[q]=cur#-位置i后面的所有元素都将向左移动,所以rank--fenw.add(i,-1)#-所有元素值移位+1fenw.add(cur,1)#-将下一个头部位置向左移动cur-=1returnans