给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:,数组中元素的值
要求:空间复杂度:,时间复杂度
保证数组输入非空,且保证有解
[1,2,3,2,2,2,5,4,2]
2
[3,3,3,3,2,2,2]
3
[1]
1
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型一维数组 * @param numbersLen int numbers数组长度 * @return int整型 */ int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here //太慢了,换个思路,第一种方法是用相同数组下标记录每个数字出现的次数 // if (numbersLen==0) { // return -1; // }else if (numbersLen==1) { // return numbers[0]; // } // int count=1; // int arr[numbersLen]; // for (int i=0; i<numbersLen; i++) { // count=1; // for (int j=0; j<numbersLen; j++) { // if (numbers[i]==numbers[j]&&i!=j) { // count++; // } // arr[i]=count; // if (arr[i]>numbersLen/2) { // return numbers[i]; // } // } // } // return -1; //第二种方法是用源数组的数字作为下标,记录每个数字出现的次数 int count[10001]; for (int i=0; i<numbersLen; i++) { count[numbers[i]]++; } for (int i=0; i<sizeof(count)/sizeof(count[0]); i++) { if (count[i]>numbersLen/2) { return i; } } return -1; }
int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here //数组为空 if(!numbers) { return -1;; } //开空间存储元素个数 int*count=calloc(1001,sizeof(int)); //遍历每个元素并计数 for(int i=0;i<numbersLen;i++) { count[numbers[i]]++; //超过一半直接输出 if(count[numbers[i]]>(numbersLen)/2) { return numbers[i]; } } //没有超过一半 return -1; }
//别的不对说暴力求解 int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { int input=0;//计数器 int i=0; for(i=0;i<numbersLen;i++) { int j=0; for(j=0,input=0;j<numbersLen;j++) { if(numbers[j]==numbers[i])//判断某元素的出现次数,出现计数器加一 { input++;//计数器加一 if(input>(numbersLen/2))//判断某元素出现的次数是否超越了数组的一半 { return numbers[i]; } } } } return 0; }
符合题目要求的解法 int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here //这个方法参考2013年408考研的代码题的最优解法 int count=0,a=numbers[0]; //a用于记录可能是出现超过一半的数组,出现一次count+1,不是则+1 for(int i=1;i<numbersLen;i++){ if(numbers[i]==a) count++; //如果这个数是可能数a,则count+1 else{ if(count>0) count--; //若这个数不是,则判断count,count>0则表明a还是有可能是的 else{ a=numbers[i]; //否则的话替换掉,因为目标数出现超过一半,所以最终还是会替换回来的 count=1; } } } return a; }
/** * * @param numbers int整型一维数组 * @param numbersLen int numbers数组长度 * @return int整型 */ int MoreThanHalfNum_Solution(int* A, int numbersLen ) { // write code here int i = 0,j = numbersLen-1; while(i<j){ if(A[i]==A[j]) i++,j--; else{ A[i]=A[j]=-1; i++,j--; } } for(i=0;i<numbersLen&&A[i]==-1;i++); int c = A[i]; int cnt=0; for(i=0;i<numbersLen;i++) if(A[i]==c) cnt++; return c; //居然过了?虽然肯定有缺陷就是了 测试用例覆盖的不是很全啊 }
/** * * @param numbers int整型一维数组 * @param numbersLen int numbers数组长度 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 * * C语言声明定义全局变量请加上static,防止重复定义 */ int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here unsigned int cntarray[10000] = {0};//可能会栈溢出:与值的最大有关 unsigned int cnt = 0; unsigned int val = 0; unsigned int div =numbersLen/2; if((numbers==NULL)||(numbersLen<0)){//参数安全检测 return -1; } while(cnt<numbersLen){ if(++cntarray[numbers[cnt]]>div){ return numbers[cnt]; } cnt++; } return -1; }
/** * * @param numbers int整型一维数组 * @param numbersLen int numbers数组长度 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) { // write code here int votes=0; int start=numbers[0]; for(int i=0;i<numbersLen;i++) { if(start!=numbers[i]) { votes--; if(votes==0) { start = numbers[i]; votes++; } } else { votes++; } } return start; }
public int MoreThanHalfNum_Solution(int [] array) {
int length=array.length;
if(array==null||length<=0){
return 0;
}
if(length==1){
return array[1];
}
int[] tempArray=new int[length];
for(int i=0;i<length;i++){
tempArray[i]=array[i];
}
for(int i=0;i<length;i++){
//后面需要用零来代表抹除数字,所以对0时做特殊处理
if(tempArray[i]==0){
continue;
}
for(int j=i+1;j<length;j++){
if(tempArray[i]!=tempArray[j]&&tempArray[j]!=0){
tempArray[i]=0;//此处用0代表抹去该数字
tempArray[j]=0;
break;
}
}
}
for(int i=0;i<length;i++){
System.out.println(tempArray[i]);
}
//找出未被抹去的数字
int result=0;
for(int i=0;i<length;i++){
if(tempArray[i]!=0){
result=tempArray[i];
break;
}
}
int times=0;
for(int i=0;i<length;i++){
if(result==array[i]){
times++;
}
}
if(times*2<length){
result=0;
}
return result;
}
}
public int MoreThanHalfNum_Solution(int [] array) {
int length=array.length;
if(array==null||length<=0){
return 0;
}
int result=array[0];
int times=1;
for(int i=1;i<length;i++){
if(times==0){
result=array[i];
times=1;
}else{
if(array[i]==result){
times++;
}else{
times--;
}
}
}
times=0;
for(int i=0;i<length;i++){
if(result==array[i]){
times++;
}
}
if(times*2<length){
result=0;
}
return result;
}
}