【剑指offer】数组中出现次数超过一半的数字 -- Python 实现

【题目描述】
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
【解题思路】
数组中出现次数超过一半的数字的意思是,如果有这样的数字存在,那么这个数字出现的次数比其他所有的数字出现的次数之和都要大。所以我们可以设置两个变量,res用来记录在一个区段内出现次数最多的数字,cnt用来记录在当前的位置上,出现最多的数字比其它数字多出现的次数——当出现了和res相同的数字时,出现最多的数字比其它数字多出现的次数又多了1,所以cnt+=1;当出现了和res不相同的数字时,出现最多的数字比其它数字多出现的次数少了1,所以cnt-=1;当cnt=0的时候,出现最多的数字和其它数字出现的次数相同,重新进行记录。具体操作如下:

  • 初始化cnt,令cnt=0

  • 遍历数组:

    • 如果cnt=0,则将当前数字赋给res,且cnt+=1
    • 如果cnt!=0且当前数字和res相等,则cnt+=1
    • 如果cnt!=0且当前数字和res不相等,则cnt-=1
  • 最后统计res出现的次数是否超过一半,若是,则返回res;若不是,返回0

用Python实现的代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        cnt = 0
        res = numbers[0]
        for i in range(len(numbers)):
            if cnt == 0:
                res = numbers[i]
                cnt += 1
            else:
                if numbers[i] == res:
                    cnt += 1
                else:
                    cnt -= 1
        cnt = numbers.count(res)
        if cnt > len(numbers)//2:
            return res
        else:
            return 0
发布了24 篇原创文章 · 获赞 0 · 访问量 244

猜你喜欢

转载自blog.csdn.net/qq_36643449/article/details/104464223
今日推荐