zoukankan      html  css  js  c++  java
  • 【LeetCode-数组】求众数 II

    题目描述

    给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
    说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
    示例:

    输入: [3,2,3]
    输出: [3]
    
    输入: [1,1,1,3,3,2,2,2]
    输出: [1,2]
    

    题目链接: https://leetcode-cn.com/problems/majority-element-ii/
    做这题之前要先做一下多数元素

    思路

    要求算法的时间复杂度为 O(n),空间复杂度为 O(1),所以排序和哈希表的算法都不能用了。这题使用和多数元素类似的投票法。
    超过n/3的元素一定不超过2个。我们将这两个数字记为candi1和candi2,对应的票数分别为cnt1和cnt2。算法如下:

    • candi1、candi2、cnt1、cnt2均初始化为0;
    • 遍历数组:
      • 如果cnt1==0,则将数组当前值赋值为candi1,cnt1++;
      • 否则,如果当前值等于candi1,cnt1++;
      • 如果cnt2==0,则将数组当前值赋值为candi2,cnt2++;
      • 否则,如果当前值等于candi2, cnt2++;
      • 如果cnt1,cnt2均不为0,且当前值和candi1,candi2都不相等,则cnt1--, cnt2--;
    • 循环结束后,再遍历数组一遍,判断candi1,candi2出现次数是否超过了n/3.

    代码如下:

    class Solution {
    public:
        vector<int> majorityElement(vector<int>& nums) {
            if(nums.empty()) return {};
    
            int candi1=0, candi2=0;
            int cnt1=0, cnt2 = 0;
    
            for(int i=0; i<nums.size(); i++){
                if(nums[i]==candi1){
                    cnt1++;
                    continue;
                }
    
                if(nums[i]==candi2){
                    cnt2++;
                    continue;
                }
    
                if(cnt1==0){
                    candi1 = nums[i];
                    cnt1++;
                    continue;
                }
    
                if(cnt2==0){
                    candi2 = nums[i];
                    cnt2++;
                    continue;
                }
    
                cnt1--;
                cnt2--;
            }
    
            cnt1 = 0;
            cnt2 = 0;
            for(int i=0; i<nums.size(); i++){
                if(nums[i]==candi1) cnt1++;
                else if(nums[i]==candi2) cnt2++;
            }
    
            vector<int> ans;
            if(cnt1>nums.size()/3) ans.push_back(candi1);
            if(cnt2>nums.size()/3) ans.push_back(candi2);
            return ans;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

    参考

    1、https://leetcode-cn.com/problems/majority-element-ii/solution/169ti-sheng-ji-ban-xiang-jie-zhu-xing-jie-shi-tong/

  • 相关阅读:
    Hadoop命令手册
    HDFS配额管理指南
    HDFS权限管理用户指南
    Hadoop分布式文件系统使用指南
    Hadoop分布式文件系统:架构和设计
    ImageLoader 图片加裁
    发送 一个无序广播
    Intent 转向
    Volley Get Post 方法
    Android 动态设置控件宽高度
  • 原文地址:https://www.cnblogs.com/flix/p/12812160.html
Copyright © 2011-2022 走看看