import java.util.*; /** * QQ2 微信红包 * @author d3y1 */ public class Gift { /** * 程序入口 * @param gifts * @param n * @return */ public int getValue(int[] gifts, int n) { int result; result = getValue1(gifts, n); // result = getValue2(gifts, n); // result = getValue3(gifts, n); // result = getValue4(gifts, n); return result; } /** * 模拟法: HashMap * @param gifts * @param n * @return */ public int getValue1(int[] gifts, int n) { HashMap<Integer, Integer> map = new HashMap<>(n); int result = 0; int value; for(int i=0; i<n; i++){ value = map.getOrDefault(gifts[i], 0)+1; if(value > n/2){ result = gifts[i]; break; } map.put(gifts[i], value); } return result; } /** * 模拟法: 排序(滑动窗口) * @param gifts * @param n * @return */ public int getValue2(int[] gifts, int n) { Arrays.sort(gifts); int gap = n/2; int result = 0; for(int i=0; i+gap<n; i++){ if(gifts[i] == gifts[i+gap]){ result = gifts[i]; } } return result; } /** * 模拟法: 排序(统计唯一可能候选者) * @param gifts * @param n * @return */ public int getValue3(int[] gifts, int n) { Arrays.sort(gifts); int mid = n/2; int candidate = gifts[mid]; int count = 0; int result = 0; for(int i=0; i<n; i++){ if(gifts[i] == candidate){ if(++count > mid){ result = candidate; break; } } } return result; } /** * 模拟法: 不排序(找到并统计唯一可能候选者) * @param gifts * @param n * @return */ public int getValue4(int[] gifts, int n) { int candidate = 0; int flag = 0; // 找到唯一可能候选者candidate for(int i=0; i<n; i++){ if(flag == 0){ candidate = gifts[i]; flag++; }else if(gifts[i] == candidate){ flag++; }else if(gifts[i] != candidate){ flag--; } } int count = 0; int result = 0; for(int i=0; i<n; i++){ if(gifts[i] == candidate){ if(++count > n/2){ result = candidate; break; } } } return result; } }