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

  1. 题目描述
    1. 思路分析

题目描述

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

思路分析

  • 解法1:利用题目特点,数字数量超过一半,则该数字一定是该数组的中位数,改造二分查找解决
  • 解法2:变遍历变求解,因为答案的那个数字的总数大于剩下的数字的总和,
    所以遍历一遍,剩下的那个数字就是答案】
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if (numbers.size() == 0) {
            return 0;
        }
        int res = numbers[0];// 记录当前中位数的可能值
        int times = 1;// 统计当前值的有效次数
        // 寻找目标
        for (int i  = 0; i < numbers.size();++i) {
            if (times <= 0) {
                res = numbers[i];
                times = 1;
            } else if (res == numbers[i]) {
                ++times;
            } else {
                times--;
            }
        }
        // 出现数量验证
        times = 0;
        for (int  i = 0; i < numbers.size();++i) {
            if (numbers[i] == res) {
                times++;
            }
        }
        if (times*2 <= numbers.size()) {
            return 0;
        }
        return res;
    }
    // 解法2
    int MoreThanHalfNum_Solution1(vector<int> numbers) {
        if (numbers.size() == 0) {
            return 0;
        }

        int num = numbers[0];
        int times = 1;
        for (int i = 1; i < numbers.size();++i) {
            if (numbers[i] == num){
                times++;
            } else if (times == 0){
                num = numbers[i];
                times = 1;
            } else {
                times--;
            }
        }
        // 出现数量验证
        times = 0;
        for (int  i = 0; i < numbers.size();++i) {
            if (numbers[i] == res) {
                times++;
            }
        }
        if (times*2 <= numbers.size()) {
            return 0;
        }
        return num;
    }
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:数组中出现次数超过一半的数字

Count:406

Author:攀登

Created At:2019-12-26, 23:12:31

Updated At:2024-06-15, 15:53:35

Url:http://jiafeimao-gjf.github.io/2019/12/26/sword-%E6%95%B0%E7%BB%84%E4%B8%AD%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0%E8%B6%85%E8%BF%87%E4%B8%80%E5%8D%8A%E7%9A%84%E6%95%B0%E5%AD%97/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation