zoukankan      html  css  js  c++  java
  • 229. Majority Element II -- 找出数组中出现次数超过 ⌊ n/3 ⌋ 次的数

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

    class Solution {
    
    public:
    
    
    
        //O(n) Space compexity
    
        vector<int> majorityElement01(vector<int>& nums) {
    
            vector<int> result;
    
            unordered_map<int, int> counts;
    
            int n = nums.size();
    
            for(auto item : nums){
    
                counts[item]++;
    
                if (counts[item] > n/3 ){
    
                   result.push_back(item); 
    
                   counts[item] = -n; // Tricky: make sure the item only can be put into result once.
    
                } 
    
            }
    
            return result;
    
        }
    
        //We know, there could be at most two numbers can be more than 1/3
    
        //so, same as Majority Element I problem, we can have two counters.
    
        vector<int> majorityElement02(vector<int>& nums) {
    
            if(nums.size()<=1) return nums;
    
            
    
            //the same algorithm as Majority Element I problem
    
            int majority1=0, majority2=0, cnt1=0, cnt2=0;
    
            for(auto item: nums) {
    
                if (cnt1 == 0 && majority2 != item ) {
    
                    majority1 = item;
    
                    cnt1 = 1;
    
                } else if (majority1 == item) {
    
                    cnt1++;
    
                } else if (cnt2 == 0) {
    
                    majority2 = item;
    
                    cnt2 = 1;
    
                } else if (majority2 == item) {
    
                    cnt2++;
    
                } else {
    
                    cnt1--;
    
                    cnt2--;
    
                }
    
            }
    
            //re-check it again, in case there has less than two numbers of majority
    
            cnt1 = cnt2 = 0;
    
            for (auto item : nums) {
    
                if (majority1 == item) cnt1++;
    
                else if (majority2 == item) cnt2++;
    
            }
    
            vector<int> result;
    
            if (cnt1 > nums.size()/3) result.push_back(majority1);
    
            if (cnt2 > nums.size()/3) result.push_back(majority2);
    
            return result;
    
        }
  • 相关阅读:
    B1001 害死人不偿命的(3n+1)猜想 (15 分)
    A1050 String Subtraction (20 分)
    A1041 Be Unique (20 分)
    B1047 编程团体赛 (20 分)
    B1043 输出PATest (20 分)
    B1042 字符统计 (20 分)
    B1038 统计同成绩学生 (20 分)
    VB计算符号
    vs2008写代码的时候不能输入中文,sogou和google输入法都没有用
    如何彻底关闭Windows7自动更新
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5807772.html
Copyright © 2011-2022 走看看