递归解决主元素

主元素判断:当一个元素在数组中占一半以上的元素。

思维: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;
}


}
posted @ 2021-04-22 19:27  网抑云黑胶SVIP用户  阅读(144)  评论(0编辑  收藏  举报