leedcode 多数元素

自己写的:
class Solution:
    def majorityElement(self, nums):
        # 创建一个空字典用于存储数字和其出现次数
        mydict = dict()

        # 遍历输入的列表 nums
        for i in nums:
            # 如果数字 i 不在字典中,将其添加到字典,并初始化计数为 0
            if i not in mydict:
                mydict.update({i: 0})
            
            # 如果数字 i 在字典中,增加其计数
            if i in mydict:
                mydict[i] += 1
        
        # 打印字典,显示每个数字的出现次数
        print(mydict)
        
        # 使用 max 函数找到字典中值最大的键,即出现次数最多的数字
        max_num = max(mydict, key=mydict.get)
        
        # 返回出现次数最多的数字
        return max_num

 分治算法:(类似于快排)

from typing import List


class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 调用辅助函数 findmajor 处理整个数组
        return self.findmajor(nums, 0, len(nums) - 1)

    def findmajor(self, nums, left, right):
        # 当左右指针相等时,说明只有一个元素,直接返回该元素
        if left == right:
            return nums[left]

        # 分割数组,计算中间位置
        mid = left + (right - left) // 2

        # 递归地在左右子数组中寻找众数
        left_major = self.findmajor(nums, left, mid)
        right_major = self.findmajor(nums, mid + 1, right)

        # 求解
        if left_major == right_major:
            return left_major
        #求解失败 进入合并阶段
        else:
            # 计算左右两个候选众数在整个区间的出现次数
            leftcount, rightcount = 0, 0
            for i in range(left, right + 1):
                if left_major == nums[i]:
                    leftcount += 1
                if right_major == nums[i]:
                    rightcount += 1

            # 返回出现次数较多的众数
            if leftcount >= rightcount:
                return left_major
            else:
                return right_major

 

posted @ 2024-03-04 10:09  Junior_bond  阅读(6)  评论(0)    收藏  举报