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

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

解法一:
若条件满足则这个数字在排序后的数组中必在最中间,所以把这个数字统计次数后和数字的一半长度比较后,若大于则满足条件,否则不满足。
因涉及到快排,故时间复杂度时O(nlgn)

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
    sort(numbers.begin(),numbers.end());
        int mid=numbers[numbers.size()/2];
        int count=0;
        for(int i=0;i<numbers.size();i++){
            if(mid==numbers[i]){
                count++;
            }
        }
        if(count>(numbers.size()/2)){
            return mid;
        }
        else{
            return 0;
        }
    }
};

解法二:
遍历当前数组,将出现的元素值作为新开辟数组的下标,出现一次则++一次,然后将新数组的下标依次与原数组长度的一半作比较,若大于则返回这个值否则返回0

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        int size = numbers.size();
        int arr[500] = { 0 };
        int i = 0;
        for (i = 0; i < numbers.size(); i++)
        {
            arr[numbers[i]]++;
        }
        for (i = 0;i< size; i++)
        {
            if (arr[numbers[i]] > (size / 2))
            {
                return numbers[i];
            }
        }
            return 0;

    }
};

解法三:
若数组中有一个数字出现的次数超过数组长度的一半,说明它出现的次数比其他数字出现的次数总和还要多,所以定义一个记录次数的变量,与之相同则times++,不同则tims--,times为0时把数组中下一个值给result,然后再判断条件是否满足。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
    int result=numbers[0];
        int times=1;
        for(int i=1;i<numbers.size();i++){
            if(times==0){
                result=numbers[i];
                times=1;
            }
            else if(numbers[i]==result){
                times++;
            }
            else{
                times--;
            }
        }
        times=0;
        for(int i=0;i<numbers.size();i++){
            if(result==numbers[i]){
                times++;
            }
        }
        if(times>numbers.size()/2){
            return result;
        }
        return 0;
    }
};

原文地址:https://blog.51cto.com/14239789/2449568

时间: 2024-08-04 05:01:34

数组中出现次数超过数组长度一半的数字的相关文章

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

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.比如输入一个长度为18的数组{1,0,2,6,1,0,1,1,5,2,1,1,1,3,1,1,5,1}, 因为数组中数字1出现的次数超过数组的长度的一半,因此输出1. 1)最直接的办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素. 2)再深入思考一下就会想到高速排序过程,利用partion找出index==middle时,index相应的值,而不必全然排序. 3)另外一种办法比較抽象,设一个变量保存当前值,设一个次数

算法学习(十一)数组中出现次数超过长度一半的数

数组中出现次数超过数组长度一半的 数字 题目描述: 给定 一个数组,找到数组中出现次数超过数组长度一半的数字,如数组 a[]= {0,1,2,1,1},输出为1 分析: 1,可以使用伴随数组b,遍历数组a,将值作为数组b的下标,将次数作为值,然后遍历数组b,找到次数超过一半的值,然后输出.时间复杂度为O(N),不过要增加空间复杂度. 2,我们可以先对数组进行排序,因为某个数字出现次数超过一半,所以在数组的N/2处,就一定是那个数字.时间复杂主要为排序的时间,使用快排O (N*logN). 3,有

给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

1 """ 2 #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 3 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 4 解题思路: 5 1.设定一个空字典,去存储列表中的值和值出现的次数 6 2.使用L.count()方法可以统计出L中值出现的次数 7 3.使用sorted方法可以进行排序,sorted(iterable,key,reverse) 8 注意key是函数 9 4.列表中的元祖取值 d[i][j] i是哪一个元祖,j是元祖

LeetCode 5126. 有序数组中出现次数超过25%的元素 Element Appearing More Than 25% In Sorted Array

地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/element-appearing-more-than-25-in-sorted-array/ 目描述给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%.请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6 提示: 1 <= arr.length <= 10^4 0 &

【Leetcode 数组】 有序数组中出现次数超过25%的元素(1287)

题目 给你一个非递减的?有序?整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6 提示: 1 <= arr.length <= 10^4 0 <= arr[i] <= 10^5 解答 # class Solution: # def findSpecialInteger(self, arr): # d = {} # length = len(arr) #

python_exercise_给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

# 设定给出的非空数组为list_a,如下list_a = [8,1,3,5,1,2,45,8,5,7,7,8,8,8,8,8,8,5,5] # 将list_a去重,留下唯一值list_a_set = set(list_a) # 将list_a去重后的值作为字典的key放到字典中list_a_dict = {x:None for x in list_a_set} # 遍历将list_a去重后的唯一值,统计唯一值出现的次数.把次数作为字典的value放到字典中for l in list_a_set

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

问题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 分析:看到此题第一反应就是将数组中的数字进行排序,然后统计数字出现的次数.排序的时间复杂度为O(nlogn). 从另一个角度出发,数组中有一个数字出现的次数大于数组长度的一半,也就是说它出现的次数比其他数字出现次数之和还要多.因此可以在遍历数组的时候保存两个值:(1)保存数组中的值:(2)保存数字出现的次数. 步骤:(1)当遍历的下一个数字与之前保存的数字不同时, 将次数减1: (2)当遍历的下一个数字与之前保存的数字相同时,

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

[题 目]数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字. [思 路1]由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我们的任务就是对该数组进行排序,而性能最好的快速排序的时间复杂度为O(nlogn),我们可以直接借助库函数完成,由于其效率不是很高,所以这里就不再赘述. [思 路2]对于一个数组中的元素的次数的统计,最快的查找方法是什么?当然哈希表了!我们能不能建立哈希表呢,稍微思考,我们就可以发现,哈希表只适用于

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt