问题背景
给你一个整数数组 n u m s nums nums,一个整数数组 q u e r i e s queries queries 和一个整数 x x x。
对于每个查询 q u e r i e s [ i ] queries[i] queries[i],你需要找到 n u m s nums nums 中第 q u e r i e s [ i ] queries[i] queries[i] 个 x x x 的位置,并返回它的下标。如果数组中 x x x 的出现次数少于 q u e r i e s [ i ] queries[i] queries[i],该查询的答案为 − 1 -1 −1。
请你返回一个整数数组 a n s w e r answer answer,包含所有查询的答案。
数据约束
- 1 ≤ n u m s . l e n g t h , q u e r i e s . l e n g t h ≤ 1 0 5 1 \le nums.length, queries.length \le 10 ^ 5 1≤nums.length,queries.length≤105
- 1 ≤ q u e r i e s [ i ] ≤ 1 0 5 1 \le queries[i] \le 10 ^ 5 1≤queries[i]≤105
- 1 ≤ n u m s [ i ] , x ≤ 1 0 4 1 \le nums[i], x \le 10 ^ 4 1≤nums[i],x≤104
解题过程
一开始自己写了个对数组中每个元素都能进行符合条件的查询的解,果然运行效率很低。
实际上只需要记录指定的元素出现的位置,由于 n u m s nums nums 数组长度有限,可以用数组来记录。
具体实现
class Solution {public int[] occurrencesOfElement(int[] nums, int[] queries, int x) {int n = nums.length;int[] list = new int[n + 1];// 初始状态下认为所有元素都不能在 nums 中查询到Arrays.fill(list, -1);for(int i = 0, count = 0; i < n; i++) {if(nums[i] == x) {// 记录某次出现的元素所在的下标list[count++] = i;}}for(int i = 0; i < queries.length; i++) {queries[i] = queries[i] > list.length ? -1 : list[queries[i] - 1];}return queries;}
}