229. 多数元素 II

题目链接:229. 多数元素 II - 力扣(LeetCode)

 

 

 

 

 

 

 

 

解析:

这题还是记录一下,哥们的两次lru肯定比题解的摩尔投票好

O(N)、O(1)的方法

找出 大于N/3 向下取整 个数 的数,这样的数最多有2个,大于2个就超过总长度了

维护一个长度为3的list,从前向后,从后向前分别来一次lru,

期望的数肯定最后会保留在这两次lru的list中,自己举例子看看分布就好了

然后求最后保留在两个list中的数,有哪些个数符合要求就可以了

class Solution {
public:

    void internal_swap(const vector<int>& nums, vector<int>& vis, int i) {
        int j;
        for (j = 0; j < vis.size(); j++) {
            if (vis[j] == nums[i]) {
                break;
            }
        }
        if (j >= vis.size()) {
            if (vis.size() < 3) vis.push_back(nums[i]);
            else {
                vis.pop_back();
                vis.push_back(nums[i]);
            }
        }
        if (j == 3) j--;
        while(j > 0) {
            swap(vis[j], vis[j - 1]), j--;
        }
    }

    bool is_has(const vector<pair<int, int>> vis, int val) {
        for (int i = 0; i < vis.size(); i++) {
            if (vis[i].first == val) return true;
        }
        return false;
    }

    vector<int> majorityElement(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums;
        vector<int> vis1;
        vector<int> vis2;
        for (int i = 0; i < n; i++) {
            internal_swap(nums, vis1, i);
        }
        for (int i = n - 1; i >= 0; i--) {
            internal_swap(nums, vis2, i);
        }
        vector<pair<int, int>> vis3;
        for (int i = 0; i < vis1.size(); i++) {
            if (is_has(vis3, vis1[i])) continue;
            vis3.push_back(make_pair(vis1[i], 0));
        }
        for (int i = 0; i < vis2.size(); i++) {
            if (is_has(vis3, vis2[i])) continue;
            vis3.push_back(make_pair(vis2[i], 0));
        }
        
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < vis3.size(); j++) {
                if (vis3[j].first == nums[i]) vis3[j].second++;
            }
        }
        vector<int> ret;
        for (auto item : vis3) {
            if (item.second > (n / 3)) ret.push_back(item.first);
        }


        return ret;
    }
};

 

posted @ 2025-12-02 22:59  WTSRUVF  阅读(0)  评论(0)    收藏  举报