229 Majority Element II 求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 你的算法应该在O(1)空间中以线性时间运行。
详见:https://leetcode.com/problems/majority-element-ii/description/
摩尔投票法 Moore Voting
Java实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | class Solution { public List<Integer> majorityElement( int [] nums) { List<Integer> res= new ArrayList<Integer>(); if (nums== null ||nums.length== 0 ){ return res; } int a=nums[ 0 ],cnta= 0 ; int b=nums[ 0 ],cntb= 0 ; for ( int num : nums) { if (num == a) { ++cnta; } else if (num == b) { ++cntb; } else if (cnta == 0 ) { a = num; cnta= 1 ; } else if (cntb == 0 ) { b = num; cntb= 1 ; } else { --cnta; --cntb; } } cnta= 0 ; cntb= 0 ; for ( int num:nums){ if (num==a){ ++cnta; } else if (num==b){ ++cntb; } } if (cnta>nums.length/ 3 ){ res.add(a); } if (cntb>nums.length/ 3 ){ res.add(b); } return res; } } |
C++实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | class Solution { public : vector< int > majorityElement(vector< int >& nums) { vector< int > res; int m = 0, n = 0, cm = 0, cn = 0; for ( auto &a : nums) { if (a == m) { ++cm; } else if (a ==n) { ++cn; } else if (cm == 0) { m = a, cm = 1; } else if (cn == 0) { n = a, cn = 1; } else { --cm, --cn; } } cm = cn = 0; for ( auto &a : nums) { if (a == m) { ++cm; } else if (a == n) { ++cn; } } if (cm > nums.size() / 3) { res.push_back(m); } if (cn > nums.size() / 3) { res.push_back(n); } return res; } }; |
参考:https://www.cnblogs.com/grandyang/p/4606822.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步