题目描述
给定一个数组,长度为n,找出数组中出现次数大于n/2的(该数组一定存在这个元素,个数超过n/2)。
题目解析
- 暴力求解:挨个进行次数统计,判断是否超过n/2
int majorityElement(int *arr,int len)
{
int count = 0;
for(int i = 0;i < len;++i)
{
for(int j = i+1;j<len;++j)
{
if(arr[j] == arr[i])
{
++count;
}
}
if(count > len/2)
{
return arr[i];
}
else
{
count = 0;
}
}
}
- 先进行排序,然后再遍历一次数组即可,看哪个数字的次数超过n/2
int majorityElement(int *arr,int len)
{
//先进行排序 排序的平均时间复杂度是O(nlogn)
//然后进行遍历即可
/*
0 1 2 2 2 3 3 4 4 4 4 4 4 4 4
i
j
i j
*/
int count = 0;
//按个遍历有序的数组子段,并统计长度
int i = 0;
int j = 0;
while(j < len)
{
if(arr[i] == arr[j])
{
if(++count > len/2)
{
return arr[i];
}
j++;
}
else
{
i = j;
}
}
}
- 利用map,现将数组放入map中,key为元素值,value是元素的个数:
int majorityElement(int *arr,int len)
{
std::map<int,int> count_;
for(int i=0;i<len;++i)
{
auto it = count_.find(arr[i]);;
if(it != count_.end())
{
it->second++;
}
else
{
count_[arr[i]] = 1;
}
}
for(auto it : count_)
{
if(it.second > len/2)
{
return it.first;
}
}
}
- 分治 与 递归的思想:
TBD