LeetCode-169. 多数元素(java)

Posted bug菌¹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-169. 多数元素(java)相关的知识,希望对你有一定的参考价值。

一、前言🔥

👨‍🎓作者:bug菌

✏️博客:CSDN掘金

💌公众号:猿圈奇妙屋

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

【开发云】年年都是折扣价,不用四处薅羊毛

       哈喽,小伙伴们,我是bug菌呀👀。由于上海这波疫情,导致很多小伙伴扛不住降薪打击而选择离开自己的上家,借此, 对于没有工作或者即将失业要重新面试的小伙伴而言,bug菌想接着把上几个月更新的专栏《每日一题LeetCode》给重新捯饬起来,只为帮助小伙伴们,能顺利上岸,收到自己心仪的offer,面试第一关, 就是算法题。因为我始终坚信,变强绝对不是一朝一夕,而是贵在长久坚持,持之以恒。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕🧈。

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

二、题目描述🔥

题目:

        给定一个大小为 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
题目来源: LeetCode原题地址
题目难度:⭐⭐⭐

三、思路分析🔥

        看到这题相对还是简单的,最简单的就是暴力破解,然后还就是排序法也能解题,至于具体的方法思路,我如下挨个给大家讲解。

思路1-计数法

        暴力破解是无敌的,根据题意要求,不是要找在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素嘛,首先最容易想到的就是计数法,找在场元素是否有满足数量大于 ⌊ n/2 ⌋ 的,统计完大于一半的数据直接返回即可。

        那我们先是对nums数组进行一层遍历,统计出所有的不同数字出现次数,这就可以用hashmap来做统计存储了,或者用hashset也行,看你们。然后完事后再对hashmap进行遍历,找出次数大于 ⌊ n/2 ⌋的那个元素即可,若不满足,返回-1。

思路2-排序法

        直接对该数组进行一次排序,然后你就会发现一个规律,相同的元素肯定是左右相邻的,且如果有一个数字出现的频率大于 ⌊ n/2 ⌋,那这个数一定是位于数组nums ⌊ n/2 ⌋位置处,若不满足,返回-1。还有对于“这个数一定是位于数组nums ⌊ n/2 ⌋位置处”结论若不信的话,你们随便写几个测试用例试试看,一验便知。

        废话不多说,直接上代码。

四、算法实现🔥

思路1-计数法AC代码:

具体算法代码实现如下:

    public class Solution 
        public int majorityElement(int[] nums) 
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            for (int item : nums) 

                //判断key是否存在,存在则+1.不存在赋值默认值0,然后+1,等于默认值为1.
                map.put(item, map.getOrDefault(item, 0) + 1);
            

            //遍历找是否存在大于n/2的元素
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) 
                if (entry.getValue() > (nums.length / 2)) 
                    return entry.getKey();
                
            
            return -1;
        
    

思路2-排序法AC代码:

    class Solution 
        public int majorityElement(int[] nums) 

            //定义一个hashmap
            Map<Integer, Integer> obj = new HashMap<>();
            for (int num : nums) 

                //判断key是否存在,存在则+1.不存在赋值默认值0,然后+1,等于默认值为1.
                obj.put(num, obj.getOrDefault(num, 0) + 1);
                if (obj.get(num) > nums.length / 2) 
                    return num;
                
            
            
            return -1;
        
    

五、总结🔥

思路1-leetcode提交运行结果截图如下:

 复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

思路2-leetcode提交运行结果截图如下:

 复杂度分析:

  • 时间复杂度:O(nlog(n))。数组排序的时间。
  • 空间复杂度:O(log(n))。考虑极端情况也就是多数元素为数组中的最小值或最大值,其个数为 ⌊n/2⌋+1,那么下标为n/2的位置,也必定恰好是多数元素,所以是logn

        综上,我们来回顾一下,这道题其实还有很多思路,比如分治法,摩尔投票法,这个我就不一一进行演示了,看大家的喜好,因为我只想讲最基础的算法分析,有助于更多地小伙伴理解。

... ...

       再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

       好啦,以上就是本期的所有内容啦,咱们下期见咯。

  六、热门推荐🔥

  1. leetcode-9.回文数
  2. leetcode-1.两数之和
  3. leetcode-13.罗马数字转整数
  4. leetcode-14.最长公共前缀
  5. leetcode-20.有效的括号
  6. leetcode-21.合并两个有序链表
  7. leetcode-26. 删除有序数组中的重复项

七、文末🔥

        如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《每日一题LeetCode》,带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。

        一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。

【开发云】年年都是折扣价,不用四处薅羊毛

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

最后送大家两句话,与诸君共勉!


☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。


​​

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。

以上是关于LeetCode-169. 多数元素(java)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode169. 多数元素(JAVA摩尔投票法)

LeetCode-169. 多数元素(java)

LeetCode 169. 多数元素

LeetCode 169. 多数元素

LeetCode169. 多数元素(摩尔投票法)

LeetCode169 多数元素