思路1:HashMap计数

利用Map的键唯一,值可以重复的原理。

如果当前元素重复则把当前重复的元素当做键,值加一添加到map中。以此来统计重复元素的个数。

如果某元素的值超过了长度一半就输出。

public class Gift {
    public int getValue(int[] gifts, int n) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < gifts.length; i++){
            if(map.containsKey(gifts[i])){
                map.put(gifts[i],map.get(gifts[i]) + 1);
            } else {
                map.put(gifts[i], 1);
            }
            if(map.get(gifts[i]) > gifts.length >> 1) {
                return gifts[i];
            }
        }
        return 0;
 	}
}

思想2:

这是一个经典的水王问题的变形。大家可以参考左神的视频讲解。

https://www.bilibili.com/video/BV1kR4y1K7Zm/?share_source=copy_web&vd_source=1679b6c6e679ee3d744792e499f95a0d

public class Gift {
    public int getValue(int[] gifts, int n) {
		int candidate = 0;
		int hp = 0;
		for(int i = 0; i < n; i++){
			if(hp == 0){
				candidate = gifts[i];
				hp++;
			} else if(gifts[i] == candidate){
				hp++;
			} else if(gifts[i] != candidate) {
				hp--;
			}
		}
		int count = 0;
		for(int item : gifts) {
			if(item == candidate) {
				count++;
			}
		}
		if(count > (n >> 1)) {
			return candidate;
		}
        return 0;
    }
}