数组中出现的次数超过数组长度的一半的数字

解法一:

int num(int *arr, int n)
{
    if(arr==NULL||n<=0)
        return 0;
 //找数组中最大的元素max
  int max=arr[0];
  for(int i=1;i<n;i++)
  {
    if(arr[i]>=max)
        max=arr[i];
  }
  //重新定义一个大小为max+1的数组arr1
  int arr1[max+1];
  //统计所给数组每个元素出现的次数,存放在数组arr1中
  for(int i=0;i<n;i++)
  {
  for(int j=0;j<max+1;j++)
  {
    if(arr[i]==j)
    {
        arr1[j]++;
    }
  }
}
//找出出现次数超过数组长度一般的元素
for(int k=0;k<max+1;k++)
{
  if(arr1[k]>(n/2))
      return k;
}
}

解法二::排序后数组中的中位数一定是出现次数超过数组长度一半的数字

    int MoreThanHalfNum_Solution(vector<int> numbers) {
       if(numbers.size()==0)
         return 0;
        //对所给数组元素进行排序
        sort(numbers.begin(),numbers.end());
        //找到排序后数组元素的中位数num
        int num=numbers[numbers.size()/2];
        //定义一个计数器
        int count=0;
        //统计中位数出现的次数
        for(int i=0;i<numbers.size();i++)
            {
            if(numbers[i]==num)
                count++;
        }
        //如果中位数出现次数的2倍大于数组长度,说明已找到
        if(count*2>numbers.size())
            return num;      
        return 0;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值