力扣 面试题 17.10 主要元素(21.3.30)

力扣 面试题 17.10 主要元素 (同题型为LeetCode 169.多数元素 区别在于169题中 主要元素是一定存在的)

题目描述:

数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

涉及内容:数组 位运算

示例:

输入:[1,2,5,9,5,9,5,5,5]
输出:5

输入:[3,2]
输出:-1

思路:

先用一个数组a记录给出的数组去除重复的值,然后遍历a,使用count()函数来统计a中每个值出现的次数,当超过A数组一半时,使用break语句跳出循环并输出此时的数值i

提交结果:

完整代码:

A=[1,2,5,9,5,9,5,5,5]
a=list(set(A))
res=-1
for i in a:
    if(A.count(i)>len(A)/2):
        res=i
        break
print(res)

思路2:

给数组先排序 ,然后循环,如果符合nums[i]==nums[i+halflen]即退出循环输出数据

res = -1
halflen = int(len(nums) / 2)
nums.sort()
for i in range( 0 , len(nums) - halflen):
     if(nums[i] == nums[i + halflen]):
         res = nums[i]
         break

PS:比较推荐第一种思路 相对来说比较简明

摩尔投票法:

摩尔投票法基于这样一个事实,当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。

算法步骤:

1.count = 0; num = nums[0]; 表示从此时开始计算投票。

2.遍历数组,如果接下来出现的数字与num相同,count加1。如果不同,count减1。

3.如果count == 0,表示之前出现的所有数字中num都是可以凑成不同的数对,一起抵消。大于1/2 n的数还会在后面出现。

4.如果count < 0,表示之前num中的数字没有到一半,所以此时完全不用考虑前面存储的元素,“删除”他们。直接从现在的新的元素开始计数,并令count = 0。

原文链接https://blog.csdn.net/shxifs/article/details/91352407

https://blog.csdn.net/happyeveryday62/article/details/104136295

https://blog.csdn.net/u014248127/article/details/79230221

posted @ 2021-03-30 19:40  乖张❤  阅读(77)  评论(0)    收藏  举报