题解 | 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字

https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numbers int整型一维数组 
# @return int整型
#
class Solution:
    def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:
        # write code here
        # 方法一:
        # 排好序的数组,超过一半的长度的元素一定在中间位置出现
        # 将其设为候补,遍历验证其出现次数是否超过长度的一半
        # numbers = sorted(numbers)
        # cond = numbers[len(numbers)//2]
        # count = 0 
        # for i in range(len(numbers)):
        #     if(numbers[i]==cond):
        #         count+=1
        # if count>len(numbers)//2:
        #     return cond

        #法2:
        #通过哈希表,统计每个元素出现的个数
        #将其构建成字典
        # dict_numbers = {}
        # for i in range(len(numbers)):
        #     if numbers[i] in dict_numbers:
        #         dict_numbers[numbers[i]]+=1
        #     else:
        #         dict_numbers[numbers[i]]=1
            
        #     if dict_numbers[numbers[i]]>len(numbers)//2:
        #         return numbers[i]

        #法3:消消乐法,超过一半的元素,一定能与其他元素抵消,并且最后有剩余
        cond=-1#设置候选人为-1
        count=0#候选人出现次数,候选人同+1,不同抵消-1
        for i in range(len(numbers)):
            if count==0:#如果候选人次数为0,重新选人
                cond=numbers[i]#选当前为候选人
                count=1#出现次数重新设为1
            else: #候选人出现次数不等0
                if cond == numbers[i]:#如果与当前候选人相同
                    count+=1 #其出现次数+1
                else:#不同
                    count-=1 #其出现次数-1
        #最后的cond为可能的候选人

        #证明是否真的过半
        count=0
        for i in range(len(numbers)):
            if numbers[i]==cond:
                count+=1
        if count>(len(numbers)//2):
            return cond    
        




全部评论

相关推荐

下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务