方法三
这个方法借用了别人的思路。
在这里我做一下简单的分析。
这个算法的时间复杂度是O(n),另外用了两个辅助变量。
k用于临时存储数组中的数据,j用于存储某个数出现的次数。
开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。
这个方法借用了别人的思路。
在这里我做一下简单的分析。
这个算法的时间复杂度是O(n),另外用了两个辅助变量。
k用于临时存储数组中的数据,j用于存储某个数出现的次数。
开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。
下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意。
int
Search(
int
A[],
int
len)
{
if (NULL == A || len <= 0 )
{
return - 1 ;
}
int k, j = 0 ;
for ( int i = 0 ;i < len; ++ i)
{
if (j == 0 )
{
k = A[i];
}
if (k == A[i])
{
++ j; // 有人说++j比j++有先天的优势,不知你是否听说,如果你也听说,有没有想过More Effective C++(C++程序员必看书籍)
} else
{
-- j;
}
}
return k;
}
{
if (NULL == A || len <= 0 )
{
return - 1 ;
}
int k, j = 0 ;
for ( int i = 0 ;i < len; ++ i)
{
if (j == 0 )
{
k = A[i];
}
if (k == A[i])
{
++ j; // 有人说++j比j++有先天的优势,不知你是否听说,如果你也听说,有没有想过More Effective C++(C++程序员必看书籍)
} else
{
-- j;
}
}
return k;
}