import java.util.*;

public class Gift {

    /**
        时间复杂度O(N): 需要遍历数组两次,2N去掉常数项为N。
        空间复杂度O(1): 只需几个常量级的临时变量。
     */
    public int getValue(int[] gifts, int n) {

        // 使用军队比武的思路来实现,这里假设红包金额数一样的属于同一个阵营,从下标0开始遍历数组,
        // 我们约定若遇到相同阵营则战斗力+1,遇到不同阵营则需要与他PK,会造成战斗力-1

        // 变量 winner 来表示当前胜出阵营,
        // 变量 combatValue 表示当前胜出阵营的战斗值

        int winner = 0; 
        int combatValue = 0; 
        
        for(int i = 0; i < n; i++){
            if(combatValue == 0){ // 若当前还没有阵营胜出,则假设gifts[i]先胜出
                winner = gifts[i];
                combatValue++;
                continue;
            }
            if(gifts[i] == winner){ // 是同一个阵营的,则战斗值加1
                combatValue++;
            }else{
                combatValue--; // 不是同一个阵营的,需要进行PK,则战斗值减1
            }
        }

        // 如果确实有某一个红包金额出现的次数超过了总数的一半,则当数组遍历完时,winner就是那个金额
        //( 因为它干掉了其他所有阵营,他的战力最后还剩1,如用例 [1,1,1,2,2]、[1,1,2,2,1] )。
        // 注意这里要考虑没有的情况,例如:[1,1,2,2,3],最后winner是3,但是它并没有超过总数的一半,
        // 所以这里需要统计最后的winner在数组中一共出现的次数是否超过了数组长度的一半。
        int count = 0;
        for(int i = 0; i < n; i++){
            if(gifts[i] == winner){
                count++;
            }
        }
        if(count > (n/2)){
            return winner;
        }else{
            return 0;
        }

        // 这里虽说是军队比武,其实就是人海战术,谁人多谁就赢了,emmmm...
    } 
}