zoukankan      html  css  js  c++  java
  • 面试题39:数组中出现次数超过一半的数字(C++)

    题目地址:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/

    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    题目示例

    示例 1:

    输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
    输出: 2

    解题思路

    思路1:对数组先排序,然后取中间的数,因为排序后中间的元素一定是出现超过一半的数字。

    思路2:哈希表统计每个数字出现的次数,当出现的次数超过一半的时候返回该元素。

    思路3:利用投票法进行选举,每个元素都可以参与众数选择,遇到和自己相同的则加一票,即vote++,遇到和自己不同的减一票,即vote--,最终剩下来的即题目所要求的。

    思路4:超过一半的数字出现的次数比其它所有数字出现的次数的总和多

    程序源码

    思路1

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            return nums[nums.size()/2];
        }
    };

    思路2

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            unordered_map<int, int> mp;
            for(int i = 0; i < nums.size(); i++)
            {
                mp[nums[i]]++;
            }
            for(int j = 0; j < nums.size(); j++)
            {
                if(mp[nums[j]] > nums.size() / 2) return nums[j];
            }
            return 0;
        }
    };

    思路3

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int vote = 0;
            int majority; //众数
            for(int i = 0; i < nums.size(); i++)
            {
                if(vote == 0) majority = nums[i];
                if(nums[i] == majority) vote++;
                else
                    vote--;
            }
            return majority;
        }
    };

    思路4

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int cnt = 1;
            int res = nums[0];
            for(int i = 1; i < nums.size(); i++)
            {
                if(res == nums[i]) cnt++;
                else cnt--;
                if(cnt == 0)
                {
                    res = nums[i];
                    cnt = 1;
                } 
            }
            return res;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    Angular 双向数据绑定
    Angular 过滤器
    Angular 自定义指令传参
    润滑油 标号
    Oracle concat
    sqlldr load UTF8 error
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    shell 执行结果赋给变量
    linux 如何显示一个文件的某几行(中间几行)
    linux shell date 用当天时间做备份文件名
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12697294.html
Copyright © 2011-2022 走看看