题目描述
给你一个待查数组 queries
,数组中的元素为 1
到 m
之间的正整数。 请你根据以下规则处理所有待查项 queries[i]
(从 i=0
到 i=queries.length-1
):
- 一开始,排列
P=[1,2,3,...,m]
。 - 对于当前的
i
,请你找出待查项queries[i]
在排列P
中的位置(下标从 0 开始),然后将其从原位置移动到排列P
的起始位置。注意,queries[i]
在P
中的位置就是queries[i]
的查询结果。
请你以数组形式返回待查数组 queries
的查询结果。
样例
输入:queries = [3,1,2,1], m = 5
输出:[2,1,2,1]
解释:待查数组 queries 处理如下:
对于 i=0: queries[i]=3, P=[1,2,3,4,5], 3 在 P 中的位置是 2,
接着我们把 3 移动到 P 的起始位置,得到 P=[3,1,2,4,5]。
对于 i=1: queries[i]=1, P=[3,1,2,4,5], 1 在 P 中的位置是 1,
接着我们把 1 移动到 P 的起始位置,得到 P=[1,3,2,4,5]。
对于 i=2: queries[i]=2, P=[1,3,2,4,5], 2 在 P 中的位置是 2,
接着我们把 2 移动到 P 的起始位置,得到 P=[2,1,3,4,5]。
对于 i=3: queries[i]=1, P=[2,1,3,4,5], 1 在 P 中的位置是 1,
接着我们把 1 移动到 P 的起始位置,得到 P=[1,2,3,4,5]。
因此,返回的结果数组为 [2,1,2,1] 。
输入:queries = [4,1,2,2], m = 4
输出:[3,1,2,0]
输入:queries = [7,5,5,8,3], m = 8
输出:[6,5,0,7,5]
限制
1 <= m <= 10^3
1 <= queries.length <= m
1 <= queries[i] <= m
算法
(模拟) $O(m^2)$
- 按照题目描述模拟,每次暴力查询,然后将查询到的结果放到起始位置。
时间复杂度
- 每个询问都需要 $O(m)$ 的时间,故总时间复杂度为 $O(m^2)$。
空间复杂度
- 需要额外 $O(m)$ 的空间存储
P
数组。
C++ 代码
class Solution {
public:
vector<int> processQueries(vector<int>& queries, int m) {
vector<int> p(m);
for (int i = 0; i < m; i++)
p[i] = i + 1;
vector<int> ans;
for (int q : queries) {
for (int i = 0; i < m; i++)
if (q == p[i]) {
ans.push_back(i);
int x = p[i];
for (int j = i - 1; j >= 0; j--)
p[j + 1] = p[j];
p[0] = x;
break;
}
}
return ans;
}
};