春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
先将数组形式的gifts[]转化成linkedlist,然后利用collections中的sort方法进行排序,这样就可以得到相同元素都在一起的一个有序数组,再进行一个for循环,使用一个计数器计算每个金额的个数就可以得到答案。
代码如下:
public static int getValue(int[] gifts, int n) {
// write code here
LinkedList<Integer> redBags = new LinkedList<>();
for(int i =0;i<gifts.length;i++){
redBags.add(gifts[i]);
}
Collections.sort(redBags, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o1-o2;
}
});
int result = 1;
int count = 0;
for(int i =0;i<gifts.length;i++){
gifts[i] = redBags.get(i);
}
for(int j = 1;j<redBags.size();j++){
if((gifts[j]!=gifts[j-1])&&j<redBags.size()){
if(result > n/2){
count = gifts[j-1];
break;
}else {
result = 1;
}
}else {
result++;
if(result>n/2)
{count = gifts[j-1];}
}
}
return count;
}