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; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号