P6113无限集中的最小数字 Java使用treeset解决
解法A 使用TreeSet解决此问题
执行用时:555 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:42 MB, 在所有 Java 提交中击败了100.00%的用户
通过测试用例:135 / 135
总体思路,一个treeset存放添加的的元素,另一个treeset存放移除的元素,当我们的存放移除的元素队列要add一个元素的时候,那么存放添加的元素的队列就要remove这个元素,从而保证每次get都是最小的元素。
popSmallest方法解析
首先要判断要弹出的元素是1的情况,关于这里为什么要
//当弹出是1的情况
if (removeset.size() == 0){
removeset.add(1);
addSet.remove(1);
return 1;
}
如果我们有添加的元素,那么就获取添加的元素,如果添加的元素小于最小删除最小的元素那么返回添加的元素,否则返回删除的最小元素,如果没有添加的元素,直接返回删除的最小元素中的数据
if (addSet.size() > 0){
//获取添加最小元素
int numberofaddmate = (int) addSet.first();
//System.out.println("获取的"+numberofaddmate);
//如果添加的元素小于最小删除最小的元素那么返回添加的元素,否则返回删除的最小元素
if (numberofaddmate <= numberofremovemate){
//System.out.println("添加"+numberofaddmate);
addSet.remove(numberofaddmate);
removeset.add(numberofaddmate);
return numberofaddmate;
}else{
removeset.add(numberofremovemate);
addSet.remove(numberofremovemate);
return numberofremovemate;
}
}else{
removeset.add(numberofremovemate);
addSet.remove(numberofremovemate);
return numberofremovemate;
}
addback方法解析
首先查看查看removeset中是否存在,如果存在就删除,之后添加到addset
//查看removeset中是否存在,如果存在就删除
if (removeset.contains(num)){
removeset.remove(num);
//添加到addset
addSet.add(num);
}