题目描述
有 n
个编号从 1
到 n
的打开的窗口,我们想要模拟使用 alt + tab 键在窗口之间导航。
给定数组 windows
包含窗口的初始顺序(第一个元素在最前面,最后一个元素在最后面)。
同时给定数组 queries
表示每一次查询中,编号为 queries[i]
的窗口被切换到最前面。
返回 windows
数组的最后状态。
示例 1:
输入:windows = [1,2,3], queries = [3,3,2]
输出:[2,3,1]
解释:
以下是每次查询后的 windows 数组:
- 初始顺序:
[1,2,3]
- 第一次查询后:
[3,1,2]
- 第二次查询后:
[3,1,2]
- 最后一次查询后:
[2,3,1]
示例 2:
输入:windows = [1,4,2,3], queries = [4,1,3]
输出:[3,1,4,2]
解释:
以下是每次查询后的 windows 数组:
- 初始顺序:
[1,4,2,3]
- 第一次查询后:
[4,1,2,3]
- 第二次查询后:
[1,4,2,3]
- 最后一次查询后:
[3,1,4,2]
提示:
1 <= n == windows.length <= 105
windows
是 [1, n]
的一个排列。
1 <= queries.length <= 105
1 <= queries[i] <= n
解法
方法一:哈希表 + 逆序遍历
根据题目描述,越是后面的查询,越是出现在最前面的位置。因此,我们可以逆序遍历 $\textit{queries}$ 数组,用一个哈希表 $\textit{s}$ 记录已经出现过的窗口。对于每一个查询,如果当前窗口不在哈希表中,我们将其加入答案数组,并将其加入哈希表中。最后,我们再次遍历 $\textit{windows}$ 数组,将不在哈希表中的窗口加入答案数组。
时间复杂度 $O(n + m)$,空间复杂度 $O(m)$。其中 $n$ 和 $m$ 分别为 $\textit{windows}$ 和 $\textit{queries}$ 数组的长度。
1
2
3
4
5
6
7
8
9
10
11
12 | class Solution:
def simulationResult(self, windows: List[int], queries: List[int]) -> List[int]:
s = set()
ans = []
for q in queries[::-1]:
if q not in s:
ans.append(q)
s.add(q)
for w in windows:
if w not in s:
ans.append(w)
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Solution {
public int[] simulationResult(int[] windows, int[] queries) {
int n = windows.length;
boolean[] s = new boolean[n + 1];
int[] ans = new int[n];
int k = 0;
for (int i = queries.length - 1; i >= 0; --i) {
int q = queries[i];
if (!s[q]) {
ans[k++] = q;
s[q] = true;
}
}
for (int w : windows) {
if (!s[w]) {
ans[k++] = w;
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Solution {
public:
vector<int> simulationResult(vector<int>& windows, vector<int>& queries) {
int n = windows.size();
vector<bool> s(n + 1);
vector<int> ans;
for (int i = queries.size() - 1; ~i; --i) {
int q = queries[i];
if (!s[q]) {
s[q] = true;
ans.push_back(q);
}
}
for (int w : windows) {
if (!s[w]) {
ans.push_back(w);
}
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | func simulationResult(windows []int, queries []int) (ans []int) {
n := len(windows)
s := make([]bool, n+1)
for i := len(queries) - 1; i >= 0; i-- {
q := queries[i]
if !s[q] {
s[q] = true
ans = append(ans, q)
}
}
for _, w := range windows {
if !s[w] {
ans = append(ans, w)
}
}
return
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | function simulationResult(windows: number[], queries: number[]): number[] {
const n = windows.length;
const s: boolean[] = Array(n + 1).fill(false);
const ans: number[] = [];
for (let i = queries.length - 1; i >= 0; i--) {
const q = queries[i];
if (!s[q]) {
s[q] = true;
ans.push(q);
}
}
for (const w of windows) {
if (!s[w]) {
ans.push(w);
}
}
return ans;
}
|