有一个int型数组长度为n,其中某个元素个数占绝大多数,即大于n/2,如何在O(n)复杂度内找到这个元素。
即:
输入{1,1,2}
输出1
输入{4,4,1,2,1,2,4}
输出4
思路:
遍历数组,对元素进行记数,可以当作军队攻山头的游戏, 每种元素视为一个军队, 上来一个本元素的士兵记数+1,来一个其他元素的士兵计数-1, 因为目标元素占绝大多数,一定是最后的胜利者, 计数为0时说明势均力敌,计数为-1时,新来的元素占上风,记录元素和计数
java代码:
static int findMajority(int[] arr){
int num = 0; // 山头小旗
int count = 0;// 山头士兵数
for(int e : arr){
if(e == num){
count ++; // 来了同军队的士兵,增加计数
} else {
count --; // 来了其他军队的士兵,减少计数
if(count < 0){ // 当前元素占了上风
num = e; // 插上红旗
count ++; // 增加计数
}
}
}
return num;
}
public static void main(String[] args) {
int[] arr = {3,3,3,3,3,4,5,2,2};
System.out.println(findMajority(arr));
}
输出:
3
全部评论