力扣 面试题 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
浙公网安备 33010602011771号