Leetcode 229.求众数II
Posted kexinxin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 229.求众数II相关的知识,希望对你有一定的参考价值。
求众数II
给定一个大小为 n 的数组,找出其中所有出现超过 ? n/3 ? 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。
解题思路
由于数组中出现次数超过 13
的数字最多只可能为两个,所以记录两个数字n1、n2,以及他们出现的次数c1、c2,遍历数组并做以下操作:
- 若当前两数字出现则把对应的次数加1;
- 若其中一个出现次数为0,则把当前数字赋给出现次数为0的数字,并将其出现次数置为1;
- 若当前数字不同于任何一个数字,则将两数字的出现次数都减1
最后得到两个数字以及他们出现的次数,再遍历一遍数组记录他们的出现次数,若大于 n3
则加入到结果中。
1 import java.util.ArrayList; 2 import java.util.List; 3 4 class Solution { 5 public List<Integer> majorityElement(int[] nums) { 6 List<Integer> res=new ArrayList<Integer>(); 7 if(nums==null||nums.length==0) return res; 8 int n1=nums[0],n2=0,c1=1,c2=0; 9 for(int i=1;i<nums.length;i++){ 10 if(nums[i]==n1) c1++; 11 else if(nums[i]==n2) c2++; 12 else if(c1==0){ 13 n1=nums[i]; 14 c1++; 15 }else if(c2==0){ 16 n2=nums[i]; 17 c2++; 18 }else{ 19 c1--; 20 c2--; 21 } 22 } 23 c1=c2=0; 24 for(int i=0;i<nums.length;i++){ 25 if(nums[i]==n1) c1++; 26 else if(nums[i]==n2) c2++; 27 } 28 if(c1>nums.length/3) res.add(n1); 29 if(c2>nums.length/3) res.add(n2); 30 return res; 31 } 32 }
以上是关于Leetcode 229.求众数II的主要内容,如果未能解决你的问题,请参考以下文章
229 Majority Element II 求众数 II