文章目录
3159. 查询数字在数组中出现的次数
题目来源
题目分析
给你一个整数数组
nums和一个整数数组queries。找出
queries中每个查询的答案:查询中第k个出现的x的下标是nums中第k个。如果x在nums中出现次数少于k,那么答案是-1。请你实现一个函数,返回查询的答案。
题目难度
- 难度:中等
题目标签
- 标签:数组、哈希表
题目限制
1 <= nums.length, queries.length <= 10^51 <= nums[i], queries[i] <= 10^6
解题思路
思路:数组记录法
- 问题定义:
- 对于每个查询
queries[i],需要找到数组nums中第queries[i]个出现的x的下标。
- 对于每个查询
- 核心算法:
- 遍历数组
nums,记录所有等于x的元素的下标。 - 使用一个列表
pos来存储这些下标。 - 对于每个查询,检查
queries[i]是否大于pos的长度,如果是,则返回-1;否则返回pos中第queries[i] - 1个元素。
- 遍历数组
- 关键步骤:
- 初始化一个列表
pos。 - 遍历
nums,将等于x的元素的下标添加到pos中。 - 遍历
queries,对于每个查询,返回对应的下标或-1。
- 初始化一个列表
核心算法步骤
- 初始化列表:
- 创建一个
ArrayList<Integer>类型的列表pos,用于存储等于x的元素的下标。
- 创建一个
- 记录下标:
- 遍历
nums,当nums[i] == x时,将下标i添加到pos中。
- 遍历
- 处理查询:
- 遍历
queries,对于每个查询queries[i],检查其是否大于pos的长度,如果是,则答案为-1;否则答案为pos.get(queries[i] - 1)。
- 遍历
- 返回结果:
- 返回一个整数数组
ans,其中包含所有查询的答案。
- 返回一个整数数组
代码实现
以下是数组记录法的 Java 代码实现:
public int[] occurrencesOfElement(int[] nums, int[] queries, int x) {
ArrayList<Integer> pos = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (nums[i] == x) {
pos.add(i);
}
}
int[] ans = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
ans[i] = pos.size() < queries[i] ? -1 : pos.get(queries[i] - 1);
}
return ans;
}
代码解读
- 记录下标:通过遍历
nums,将所有等于x的元素的下标添加到列表pos中。 - 处理查询:对于每个查询
queries[i],检查其在pos中的位置,并返回相应的下标或-1。
性能分析
- 时间复杂度:
O(n + q),其中n是数组nums的长度,q是数组queries的长度。遍历nums的时间复杂度是O(n),处理每个查询的时间复杂度是O(1)。 - 空间复杂度:
O(n),用于存储等于x的元素的下标。
测试用例
你可以使用以下测试用例来验证代码的正确性:
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 2, 2};
int[] queries = {1, 2, 3};
int x = 2;
int[] ans = occurrencesOfElement(nums, queries, x);
System.out.println(Arrays.toString(ans)); // 输出: [1, 4, -1]
}
扩展讨论
有没有其他方法?
除了上述方法,我们还可以考虑以下方法:
双指针法
如果我们知道 x 在 nums 中出现的次数,我们可以使用双指针来找到第 k 个出现的 x 的下标。但是这种方法需要先遍历一次 nums 来统计 x 的出现次数,然后再进行第二次遍历来找到第 k 个 x 的下标。
二分查找法
如果我们预先处理 nums,将所有等于 x 的元素的下标存储在一个数组中,那么对于每个查询,我们可以使用二分查找来快速找到第 k 个出现的 x 的下标。这种方法在查询数量非常多时可能更高效。
总结
本题的核心在于如何有效地记录和查询特定元素在数组中的出现位置。通过使用列表来记录所有等于 x 的元素的下标,我们可以轻松地处理查询。这种方法简单直观,且在大多数情况下都能提供不错的性能。

189

被折叠的 条评论
为什么被折叠?



