LeetCode-169. 多数元素(java)

一、前言?

?‍?作者:bug菌

✏️博客:CSDN​、掘金等

?公众号:​​猿圈奇妙屋​

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

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

《每日一题LeetCode》给重新捯饬起来,只为帮助小伙伴们,能顺利上岸,收到自己心仪的offer,面试第一关, 就是算法题。因为我始终坚信,变强绝对不是一朝一夕,而是贵在长久坚持,持之以恒。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕?。

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

二、题目描述?

题目:

        给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

具体请看如下示例:

示例 1:

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

LeetCode-169. 多数元素(java)

示例 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提交运行结果截图如下:

LeetCode-169. 多数元素(java)

复杂度分析:

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

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

LeetCode-169. 多数元素(java)

 复杂度分析:

  • 时间复杂度: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. 删除有序数组中的重复项​

七、文末?

《每日一题LeetCode》,带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。

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

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

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


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

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


LeetCode-169. 多数元素(java)

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

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

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

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

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

发表评论

相关文章