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

    题目描述:

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


    分析:

     主元素问题。只要每次都从数组中移除两个不相同的数值,

    如果有出现的次数超过数组长度的一半的数,那么就是最后剩下来的那个。

    最后再检验一次是否有这样的数。


    代码:

     1 class Solution {
     2 public:
     3     int MoreThanHalfNum_Solution(vector<int> numbers) {
     4         // 从数组中移除两个不相同的数值,如果有出现的次数超过数组长度的一半的数,那么就是最后剩下来的那个
     5         int numSize = numbers.size();
     6         int candidate = 0;  // 候选数,可能是出现的次数超过数组长度的一半的数
     7         int cnt = 0;    // 标记当前的候选数没被抵消的次数
     8         for(int i = 0; i < numSize; i++) {
     9             if(cnt == 0) candidate = numbers[i];    // 重选候选数
    10             if(candidate == numbers[i]) cnt++;  // 次数加1
    11             else cnt--; // 次数减1
    12         }
    13         cnt = 0;
    14         for(int i = 0; i < numSize; i++)    // 检验
    15             if(numbers[i] == candidate)
    16                 cnt++;
    17         if(cnt * 2 <= numSize) return 0;
    18         return candidate;
    19     }
    20 };
  • 相关阅读:
    linux安装pip
    keepalived 安装和配置
    SecureCRT突然卡死的问题
    python url合并与分离
    centos 长久路由表
    linux shell中 if else以及大于、小于、等于逻辑表达式介绍
    mtime,ctime,atime
    linux学习初体验
    Python数据库连接池DBUtils
    Flask 中的蓝图(BluePrint)
  • 原文地址:https://www.cnblogs.com/jacen789/p/7747651.html
Copyright © 2011-2022 走看看