zoukankan      html  css  js  c++  java
  • 数组中出现次数超过一半的数字

    题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

    思路:常规思路是先排序,(若有)取中间值即可,时间复杂度为O(nlogn)。定义两个变量,一个是数组中的一个数cur,一个为次数times。遍历到下一个数时,若这之前保存的数相同,则次数加1,若不同则见,若本次比较中times为0,则更新cur,同时times置1。最后若有超过数组长度一半的元素,则返回cur,没有则返回0,对于是否有,则只需再次遍历数组找到等于cur的个数,若个数超过数组一半,则有,否则没有。时间复杂度为O(n)。

    代码如下:

     1 class Solution {
     2 public:
     3     int MoreThanHalfNum_Solution(vector<int> numbers) 
     4     {
     5         if(numbers.empty()) return 0;
     6         int cur=numbers[0];
     7         int times=1;
     8         int len=numbers.size();
     9         for(int i=1;i<numbers.size();++i)
    10         {
    11             if(times==0)
    12             {
    13                 cur=numbers[i];
    14                 times=1;
    15             }
    16             else if(cur==numbers[i])
    17                 times++;
    18             else
    19                 times--;
    20         }
    21         int totalRep=0;
    22         for(int i=0;i<len;++i)
    23         {
    24             if(numbers[i]==cur)
    25                 totalRep++;
    26         }
    27         if(totalRep<=len/2)
    28             return 0;
    29         return cur;
    30     }
    31 };

    注意要加上最后的判断。

  • 相关阅读:
    c++ 函数中的部分代码执行一次
    如何限制对象只能建立在堆上或者栈上
    FFMPEG Qt视频播放器
    C/C++中带可变参数的函数
    柔性数组
    压缩图片网站
    vscode存盘时格式化
    两个i标签之间有缝隙
    node 中process进程argv,argv0,execArgv,execPath
    chalk插件 使终端输出的字带颜色
  • 原文地址:https://www.cnblogs.com/love-yh/p/7363854.html
Copyright © 2011-2022 走看看