递归解决主元素
主元素判断:当一个元素在数组中占一半以上的元素。
思维:int nums[] = {3,1,3,2,3,3,4,3};
(1)初始计数器为1,当遇到相同的时候+1,不同时-1
(2)剩余两种情况,一种是返回的元素很有可能是主元素,也可能不是
(3)还有一种是计数器为0,说明数组是偶数,不存在主元素
package test;
class Majority{
public static void main(String[] args){
Majority mm = new Majority();
//int nums[] = {1,3,2,3,3,4,3};
//int nums[] = {1,3,2,3,3,4,3,7,7,7,7,7};
int nums[] = {3,1,3,2,3,3,4,3};
int candidate = mm.getCandidate(nums,0,nums.length);
if(candidate > 0 && mm.verify(nums,candidate)){
System.out.println("数组主元素是"+candidate);
}
else{
System.out.println("无数组主元素");
}
}
/*
返回可能的数组主元素。假设数组里的元素都是非负整数.
三个参数分别是数组,开始下标,结束下标
*/
public int getCandidate(int nums[], int begin, int end ){
int j = begin,count = 1;
int c = nums[j];
while(j<end-1 && count>0) {
j++;
if(nums[j]==c) {
count = count + 1;
}else {
count = count - 1;
}
}
if(j==end-1 && count>0) {
return nums[j]; //当剩余的时候说明很有可能是组元素,此时我们返回此时下标到验证函数中验证
}else if(j==end-1 && count == 0 ) {
return 0; //返回0代表没有组元素
}else {
return getCandidate(nums,j,end); //递归调用
}
}
/*
验证数组主元素
*/
public boolean verify(int nums[],int candidate){
int count = 0;
for(int i =0; i < nums.length;i++){
if(nums[i] == candidate){
count ++;
}
}
if(count >= nums.length/2 + 1){
return true;
}
return false;
}
}