zoukankan      html  css  js  c++  java
  • Leetcode 229.求众数II

    求众数II

    给定一个大小为 的数组,找出其中所有出现超过  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 }

     

  • 相关阅读:
    MobaXtern显示中文
    SD卡识别——记一次stm32识别BanqSD卡 V2.0识别失败的经历。
    《Java 底层原理》Jvm GC算法
    《Java 并发编程》ThreadLock详解
    《Java 底层原理》Jvm对象结构和指针压缩
    《Java 底层原理》Java内存模型
    《Java 底层原理》Java 字节码详解
    jinjia2中的变量使用
    jsonify和json的区别
    虚拟环境是什么?有什么用?怎么用?
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10203084.html
Copyright © 2011-2022 走看看