在数组中寻找出现次数超过数组长度一半的数

春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。

测试样例:
[1,2,3,2,2],5
返回:2

两种思路:1.建立HashMap,用于统计每个数在数组中出现的次数。遍历数组,将结果存入HashMap中。遍历HashMap,看是否存在出现次数超过一半的数。
2.利用寻找数组中出现次数最多的数的算法得出该数,再次遍历数组看该数出现的次数是否超过数组长度的一半。
 1 import java.util.*;
 2  
 3 public class Gift {
 4     public int getValue(int[] gifts, int n) {
 5         if (gifts == null || gifts.length == 0) {
 6             return 0;
 7         }
 8         if (gifts.length != n) {
 9             return 0;
10         }
11        Map<Integer, Integer> map = new HashMap<>();
12         for (int i = 0; i < n; i++) {
13             if (map.containsKey(gifts[i])) {
14                 int count = map.get(gifts[i]);
15                 map.put(gifts[i], count + 1);
16             } else {
17                 map.put(gifts[i], 1);
18             }
19         }
20         for(Map.Entry<Integer, Integer> entry : map.entrySet()){
21             if (entry.getValue() > n / 2) {
22                 return entry.getKey();
23             }
24         }
25         return 0;
26     }
27 }
28  
29 
30 . . 
31 添加笔记 

 

posted @ 2016-03-27 09:58  YuriFLAG  阅读(307)  评论(0编辑  收藏  举报