码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-09-17 00:00:07      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:思路分析   ==   strong   有一个   代码   count   hal   span   test   

  • 题目描述

    给定一个数组,如果这个数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字;如果不存在,则返回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版

标签:思路分析   ==   strong   有一个   代码   count   hal   span   test   

原文地址:https://www.cnblogs.com/AmazingCodeLee/p/9657941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!