【剑指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

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

时间: 2024-08-28 18:17:49

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

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

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路: 两种思路.第一种思路,出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半.第二种思路根据数组的特点,出现次数超过一半的数,他出现的次数比其他数字出

剑指offer——数组中出现次数超过一半的数字(c++)

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路一遍历数组是保存两个值:一个是数字中的一个数字,另一个是次数.当遍历到下一个数字的时候,如果下一个数字和之前保存的数字相等,则次数加1:如果不同,则次数减1:如果次数为零,那么我们需要保存下一个数字,并把次数设置为1.由于我们要找的数字出现的次数比其他所有数字出现的次数之和还

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

链接 牛客OJ:数组中出现次数超过一半的数字 九度OJ:http://ac.jobdu.com/problem.php?pid=1370 GitHub代码: 029-数组中出现次数超过一半的数字 CSDN题解:剑指Offer–029-数组中出现次数超过一半的数字 牛客OJ 九度OJ CSDN题解 GitHub代码 数组中出现次数超过一半的数字 1370-数组中出现次数超过一半的数字 剑指Offer–029-数组中出现次数超过一半的数字 029-数组中出现次数超过一半的数字 题意 题目描述 输入一

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

(注意到目标数 超过数组长度的一半,对数组同时去掉两个不同的数字,到最后剩下的一个数就是该数字.如果剩下两个,那么这两个也是一样的,就是结果),在其基础上把最后剩下的一个数字或者两个回到原来数组中,将数组遍历一遍统计一下数字出现次数进行最终判断. public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int length=array.length; if(array==null||length<=0

【剑指offer】Q29:数组中出现次数超过一半的数字

就本题而言,个人觉得练习下partition函数是有必要的,毕竟它是快速排序的核心,是基础性的东西,也是必须要掌握的,至于书中给出的"取巧"性解法,是属于个人思维能力的考察,是一种考虑问题的思路,不是一两个问题就能练就的. partition函数,包括快速排序,是一定要信手拈来的,必须的. import random def MoreThanHalf(array): if len(array) == 0: return 0 start = 0 end = len(array) - 1

剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

【剑指offer】十九,数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:找数组中出现次数超过一半的数字,我们一半可以采用两种方法,一是使用快排,对数组进行排序,然后直接输出排序数组中间位置的数.第二种是使用HashMap<Integer,Integer>,key是数组中的数字,value为其在数组中出现的次数,顺序扫描数组,记录下数组出现的次数,输出大于数组长

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

数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路 若一个数出现的次数超过长度的一半,那么这个数出现的次数比数组里的其他数都多 用num来存数组的数,times来存次数,遍历数组,遇到一个数若跟num相等,times++,若不相等,times--,若times为零,则num存入下一个数,最后n