LeetCode-169. 多数元素(java)
Posted bug菌¹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-169. 多数元素(java)相关的知识,希望对你有一定的参考价值。
一、前言🔥
👨🎓作者:bug菌
💌公众号:猿圈奇妙屋
🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。
🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系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
综上,我们来回顾一下,这道题其实还有很多思路,比如分治法,摩尔投票法,这个我就不一一进行演示了,看大家的喜好,因为我只想讲最基础的算法分析,有助于更多地小伙伴理解。
... ...
再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。
好啦,以上就是本期的所有内容啦,咱们下期见咯。
六、热门推荐🔥
- leetcode-9.回文数
- leetcode-1.两数之和
- leetcode-13.罗马数字转整数
- leetcode-14.最长公共前缀
- leetcode-20.有效的括号
- leetcode-21.合并两个有序链表
- leetcode-26. 删除有序数组中的重复项
七、文末🔥
如果你还想要学习更多,小伙伴们大可关注bug菌专门为你们创建的专栏《每日一题LeetCode》,带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。
一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。
我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!
最后送大家两句话,与诸君共勉!
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。
💌如果文章对您有所帮助,就请留下您的赞吧!(#^.^#);
💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;
💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);
💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。
以上是关于LeetCode-169. 多数元素(java)的主要内容,如果未能解决你的问题,请参考以下文章