给一个长度为 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;
}
}