剑指Offer数组中出现次数超过一半的数字 Python版

Posted amazingcodelee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer数组中出现次数超过一半的数字 Python版相关的知识,希望对你有一定的参考价值。

  • 题目描述

    给定一个数组,如果这个数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字;如果不存在,则返回0。

  • 思路分析

    对于一个数组而言,满足题目要求的数字最多只有一个,可以采用数字相互抵消的思想。在遍历数组时,储存两个值now和count,now是当前数字,count是该数字的标记。当下一个数字与now相等时,标记count的值加1,如果不相等,则减1;当标记count的值变为0时,则将下一个数字的值用now来存储,并将count的值置为1,继续遍历完数组。

    如果数组中存在出现次数超过数组长度一半的数,那遍历过后now中存储的即为这个数字;

    如果数组中不存在满足要求的数,最后now中也会存储一个不符合要求数值。

    所以,在算法的最后,要重新遍历一遍数组,对变量now中的值进行计数并判断,从而验证结果。

  • 解法

    根据思路编写代码,时间复杂度为O(N)

    

 1 def HalfLengthSolution(self, numbers):
 2         #判断极端情况
 3         if len(numbers) == 0:
 4             return 0
 5         #初始化记录变量now和count
 6         count = 1
 7         now = numbers[0]
 8         length = len(numbers)
 9         #遍历数组,采用抵消的方法,寻找结果
10         for i in range(1,length):
11             if count == 0:
12                 now = numbers[i]
13                 count += 1
14             else:
15                 if numbers[i] == now:
16                     count += 1
17                 else:
18                     count -= 1
19         #验证now中存储的值是否符合题目要求
20         test = 0
21         for item in numbers:
22             if item == now:
23                 test += 1
24         if test > length/2:
25             return now
26         else:
27             return 0

 

以上是关于剑指Offer数组中出现次数超过一半的数字 Python版的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 39. 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字-剑指Offer

剑指offer 28.数组中出现次数超过一半的数字

Java 剑指offer(39) 数组中出现次数超过一半的数字

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

剑指 Offer 39. 数组中出现次数超过一半的数字 的 详细题解