java - Hackerrank:频率查询问题出现超时错误,如何进一步优化代码?
问题描述
我在java 8中使用hashmap函数编写的代码出现超时错误。当我提交答案时,由于hackerrank平台上的14个测试用例中有5个测试用例超时错误而失败。
下面是问题
您会收到查询。每个查询都是下面描述的两个整数的形式:
- x : 在你的数据结构中插入 x。
- y :从数据结构中删除一次出现的 y(如果存在)。
- z :检查是否存在任何频率恰好为 z 的整数。如果是,则打印 1,否则打印 0。
查询以二维数组的形式给出,其中查询[i][0] 包含操作,查询[i][1] 包含数据元素。
我应该如何进一步优化这段代码?
static HashMap<Integer,Integer> buffer = new HashMap<Integer,Integer>();
// Complete the freqQuery function below.
static List<Integer> freqQuery(List<List<Integer>> queries) {
List<Integer> output = new ArrayList<>();
output = queries.stream().map(query -> {return performQuery(query);}).filter(v -> v!=-1).collect(Collectors.toList());
//get the output array iterate over each query and perform operation
return output;
}
private static Integer performQuery(List<Integer> query) {
if(query.get(0) == 1){
buffer.put(query.get(1), buffer.getOrDefault(query.get(1), 0) + 1);
}
else if(query.get(0) == 2){
if(buffer.containsKey(query.get(1)) && buffer.get(query.get(1))>0 ){
buffer.put(query.get(1), buffer.get(query.get(1)) - 1);
}
}
else{
if(buffer.containsValue(query.get(1))){
return 1;
}
else{
return 0;
}
}
return -1;
}
public static void main(String[] args) {
List<List<Integer>> queries = Arrays.asList(
Arrays.asList(1,5),
Arrays.asList(1,6),
Arrays.asList(3,2),
Arrays.asList(1,10),
Arrays.asList(1,10),
Arrays.asList(1,6),
Arrays.asList(2,5),
Arrays.asList(3,2)
);
long start = System.currentTimeMillis();
System.out.println(freqQuery(queries));
long end = System.currentTimeMillis();
//finding the time difference and converting it into seconds
float sec = (end - start) / 1000F;
System.out.println("FreqQuery function Took "+sec + " s");
}
}
解决方案
您的代码的问题是z
操作。具体来说,该方法containsValue
具有线性时间复杂度,使得算法的整体复杂度在O(n*n)
. 这是一个提示:在您拥有的哈希映射之上添加另一个哈希映射,该哈希映射按另一个映射的值计算出现次数。这样,您可以通过值直接查询第二个(因为在这种情况下它将是键)。
推荐阅读
- android - 实用更新应用程序时出现PackageInstaller错误
- c# - 如何以另一种形式访问控制(按钮)[C#]
- laravel - 背包 laravel 如何在同一个视图中显示相关表
- javascript - 如何添加错误处理以检查输入是否是单独函数中的数字
- c# - 如何通过c#将用户控件从另一个用户控件带到前面
- php - 用于登录的标准正确 ajax 响应
- java - Java 嵌套的 while 循环无法按预期运行
- r - rbokeh,将图例添加到直方图
- python - 简化动态列表中字符串的修改?
- android - 如何在mainActivity中设置ExpandableListView的childView