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

题目

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

牛客网 OJ
AcWing OJ

C++ 题解

方法一

如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
在遍历数组时保存两个值:

  • 数组中一个数字
  • 出现的次数。
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int>& nums) 
    {
        int count = 1, val = nums[0];
        for (int i = 1; i < nums.size(); i ++) 
        {
            if (nums[i] == val) 
                count++;
            else  
                count--;
            if (count == 0) 
            { 
                val = nums[i];
                count = 1;
            }
        }
        
        // 统计最高频数字一共出现的次数
        count = 0;
        for (int i = 0; i < nums.size(); i ++) 
        {
            if(val == nums[i])
                count++;
        }        
        
        // 最高频数字出现的额次数大于数组长度的一半才有效,否则返回0
        if(count*2 <= nums.size())
        {
            val = 0;
        }
        
        return val;
    }
};

方法二

数组排序后,如果符合条件的数存在,则一定是数组中间那个数:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        if(numbers.empty())
            return 0;
        
        sort(numbers.begin(),numbers.end());
        int middle = numbers[numbers.size()/2];
        
        int count=0; // 出现次数
        for(int i=0;i<numbers.size();++i)
        {
            if (middle==numbers[i])
                count ++;
        }
        
        return count*2 > numbers.size() ? middle : 0;
    
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        if not numbers:
            return 0 
        
        count = 1
        val = numbers[0]
        
        # 注意此处略过第一个元素
        for i in numbers[1:]:
            if i == val:
                count += 1
            else:
                count -= 1
            
            if count == 0:
                val = numbers[i]
                count = 1
        
        count = 0
        for i in numbers:
            if val == i:
                count += 1
        
        return val if count*2 > len(numbers) else 0                

方法二

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        if not numbers:
            return 0
        
        numbers.sort()
        middle = numbers[len(numbers)/2]
        
        count = 0
        for i in numbers:
            if middle == i:
                count += 1        
        
        return middle if count*2>len(numbers) else 0
posted @ 2019-03-15 18:56  youngliu91  阅读(114)  评论(0编辑  收藏  举报