• Leetcode169题 | 多数元素(python解法)


    题目

    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

    你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    示例 1:

    输入:nums = [3,2,3]
    输出:3
    示例 2:

    输入:nums = [2,2,1,1,1,2,2]
    输出:2

    提示:
    n == nums.length
    1 <= n <= 5 * 104
    -109 <= nums[i] <= 109

    进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

    博主解法

    思路是,创建一个字典,keys代表出现的数字,对应的values代表这个数字出现的次数, 然后返回values中最大的值,因为题目就是返回一个int类型的值,所以getdic就是根据题目给的list返回一个字典,然后再根据字典的values的最大值返回keys列表的下标,最后返回这个下标对应的key

    class Solution:
        def getdic(self,nums) -> dict:
            dic = dict()
            for i in range(len(nums)):
                if nums[i] not in dic.keys():
                    dic[nums[i]] = 1
                else:
                    dic[nums[i]] =  dic.get(nums[i])+1
            return dic
    
        def majorityElement(self, nums: List[int]) -> int:
            DICT = self.getdic(nums)
            val_list = list(DICT.values())
            key_list=list(DICT.keys())
            MAX = max(val_list)
            ind=val_list.index(MAX)
            return key_list[ind]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    但是就是时间复杂度较高

    优解

    排序

    思路:排序数组,如果有一个数字出现的频率大于n/2,则在数组nums.length / 2的位置就是这个数
    复杂度分析:时间复杂度:O(nlogn),快排的时间复杂度。空间复杂度:O(logn),排序需要logn的空间复杂度

    class Solution {
        public int majorityElement(int[] nums) {
            Arrays.sort(nums);
            return nums[nums.length / 2];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    哈希表

    思路:循环数组,用哈希表存储数字和对应的个数,如果数字出现的个数大于n/2则返回这个数,其实简单来讲就是计数法

    复杂度分析:时间复杂度:O(n),n为nums数组的长度。空间复杂度:O(n),哈希表需要的空间

    class Solution {
        public int majorityElement(int[] nums) 
        {
            Map<Integer,Integer> obj = new HashMap<>();
            for(int num : nums)
            {
                obj.put(num, obj.getOrDefault(num, 0) + 1);
                if(obj.get(num) > nums.length / 2) return num;
            }
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    摩尔投票法

    就像古代战争几个国家混在一起打仗,各方士兵只能一换一,不对自己人下手,战争之后剩下的人属于哪个国家,哪个国家获胜,其他国家失败。
    在这里插入图片描述
    得票数为0说明保持中立,初始化候选人为列表第一个数字

    1. 如果得票数为0且接下来的数字和候选人不一样,就换掉候选人,并增加得票数,
    2. 如果得票数不为零,候选人相同就+1,不同-1
    class Solution02(object):
        def majorityElement(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            if not nums:
                return
            targetnum = nums[0]
            cnt = 0  
            for n in nums:
                if targetnum == n:
                    cnt += 1
                else:
                    cnt -= 1
                if cnt == -1:
                    targetnum = n
                    cnt = 0 
            return targetnum
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    武汉新时标文化传媒有限公司视频引流推广
    “因遭勒索软件攻击,我被认定工作失职开除,并被老东家索赔 21.5 万元”
    数据增强方法汇总
    Rust编写Windows服务
    【Python编程】【Jupyter Notebook】启动时报错:no available port could be found
    Problem: 205. 同构字符串;力扣;python
    Java多关键词分级搜索实现
    MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具
    Linux command: ps and netstat
    js 文字超过div宽度的时候,自动换行
  • 原文地址:https://blog.csdn.net/Yizkkkkang/article/details/126410350