在不保证存在的情况下,先假设存在,若存在则每次删除两个不同的数字,最后的结果无非是全部删光,或者还剩一个,可以用一个数字个数的计数器模拟这个过程,模拟的复杂度是O(n)的,得到那个数字后,再O(n)扫一遍判断是否出现次数大于等于总数一半即可
class Gift {
public:
int getValue(vector<int> gifts, int n) {
// write code here
int cnt = 0, num = 0;
for (int i = 0; i < n; i ++) {
if (cnt == 0) {
num = gifts[i];
cnt ++;
continue;
}
if(num == gifts[i]) {
cnt ++;
}
else {
cnt --;
}
}
int pcnt = 0;
for (int i = 0; i < n; i ++) {
if (gifts[i] == num) {
pcnt ++;
}
if (pcnt >= (n + 1) / 2)
return num;
}
return 0;
}
};