假设我们有一个介于1和m之间的正整数的数组查询,我们必须根据以下规则处理所有查询querys [i](从i = 0到n,n是查询的大小-1)-
首先,我们有排列P = [1,2,3,...,m]。
对于当前的i,找到查询[i]在置换P中的位置(从0开始索引),然后在置换P的开头移动它。
我们必须找到一个包含给定查询结果的数组。
因此,如果输入类似于查询= [3,1,2,1],m = 5,则输出将为[2,1,2,1],这是因为查询的处理如下-
对于索引i = 0:query [i] = 3,P = [1,2,3,4,5],P中3的位置为2,然后将3移到P的开头,得出P = [3, 1,2,4,5]。
对于索引i = 1:query [i] = 1,P = [3,1,2,4,5],P中1的位置为1,然后将1移到P的开头,得出P = [1, 3,2,4,5]。
对于索引i = 2:query [i] = 2,P = [1,3,2,4,5],P在2中的位置为2,然后将2移到P的开头,得出P = [2, 1,3,4,5]。
对于索引i = 3:query [i] = 1,P = [2,1,3,4,5],P在1的位置为1,然后将1移到P的开头,得出P = [1, 2,3,4,5]。
最后,包含结果的数组为[2,1,2,1]。
为了解决这个问题,我们将遵循以下步骤-
定义数组ret
定义数组v
对于初始化i:= 0,当i − m,更新(将i增加1)时,执行−
在v的末尾插入i + 1
对于q中的每个值x
如果我与pos相同,则-
在temp的末尾插入v [i]
忽略以下部分,跳至下一个迭代
如果v [i]与x相同,则-
pos:=我
从循环中出来
pos:= -1
定义阵列温度
对于初始化i:= 0,当i <v的大小时,更新(将i增加1),执行-
在索引v [pos]的temp中插入temp的第一个元素
对于初始化i:= 0,当i <v的大小时,更新(将i增加1),执行-
v:=温度
在ret的末尾插入pos
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<int> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> processQueries(vector<int>& q, int m) { vector<int> ret; vector<int> v; for (int i = 0; i < m; i++) v.push_back(i + 1); for (int x : q) { int pos = -1; vector<int> temp; for (int i = 0; i < v.size(); i++) { if (v[i] == x) { pos = i; break; } } temp.insert(temp.begin(), v[pos]); for (int i = 0; i < v.size(); i++) { if (i == pos) continue; temp.push_back(v[i]); } v = temp; ret.push_back(pos); } return ret; } }; main(){ Solution ob; vector<int> v = {3,1,2,1}; print_vector(ob.processQueries(v, 5)); }
{3,1,2,1}, 5
输出结果
[2, 1, 2, 1, ]