赞
踩
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
示例 1:
输入:nums = [3,2,3] 输出:[3]
示例 2:
输入:nums = [1] 输出:[1]
示例 3:
输入:nums = [1,2] 输出:[1,2]
方法一:使用HashMap,key记录值,value记录出现次数
- class Solution {
- public List<Integer> majorityElement(int[] nums) {
- Map<Integer,Integer>map=new HashMap<>();
- for(int x:nums){
- map.put(x,map.getOrDefault(x,0)+1);
- }
- int n=nums.length;
- int t=n/3;
- List<Integer> list=new ArrayList<>();
- for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
- if(entry.getValue()>t){
- list.add(entry.getKey());
- }
- }
-
- return list;
- }
- }
方法二:使用摩尔投票:一个数组中出现次数要大于总数的三分之一,满足条件的最多也只有两个数
- class Solution {
- public List<Integer> majorityElement(int[] nums) {
- int a=nums[0];
- int a1=0;
- int b=nums[0];
- int b1=0;
-
- for(int x:nums){
- if(x==a){
- a1++;
- }else if(x!=a&&x!=b&&b1==0){
- b=x;
- b1++;
- }else if(x!=a&&x!=b&&a1==0){
- a=x;
- a1++;
- }else if(x!=a&&x!=b){
- a1--;
- b1--;
- }else if(x==b){
- b1++;
- }
-
- }
- List<Integer>list=new ArrayList<>();
- a1=0;
- b1=0;
- for(int x:nums){
- if(x==a) a1++;
- else if(x==b) b1++;
- }
- int t=nums.length/3;
- if(a1>t){
- list.add(a);
- }
- if(b1>t){
- list.add(b);
- }
- return list;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。