题目大意:
多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=169
解题思路分析:
这道简单题有很多种解法,最容易想到的就是统计一下每种数字的个数,其中个数最多的即是答案。另外一种解法可以将数组进行排序,由于肯定存在一个数字的个数大于总数的一半,因此,该数组排序后中间位置的数字一定是个数最多的那个。
上面简单的方法这里就不给出代码了。这道题其实是摩尔投票算法的经典实用场景,这里介绍一下该算法。
首先考虑最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数一半的数字(并且假设这个数字一定存在)。显然这个数字只可能有一个。摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
实现代码:
public int majorityElement(int[] nums) { int res=0; // 返回结果 int count=0; // 未被抵消的数量 for(int n : nums){ // 循环每个数字 // 如果count为0,说明之前的数字都被抵消了 if(count==0){ res=n; // 将当前数字设为返回结果 count=1; // 未被抵消的数量为1 }else{ // count不为0 // 当前数字与返回结果相同,count加一 if(n==res) count++; // 反之count减一(count不会小于0,当等于0时会进入上面的if文) else count--; } } return res; // 剩下的元素即是返回结果。 }
本题解法执行时间为1ms。
Runtime: 1 ms, faster than 99.81% of Java online submissions for Majority Element.
Memory Usage: 42.6 MB, less than 58.82% of Java online submissions for Majority Element.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-169-majority-element-解题思路分析/
Pingback引用通告: LEETCODE 1157. Online Majority Element In Subarray 解题思路分析 - LEETCODE从零刷LEETCODE从零刷