classSolution { public: intmajorityElement(vector<int>& nums){ int n = nums.size(); unordered_map<int, int> mp; for (auto x : nums) mp[x]++; for (auto [k, v] : mp) { if (v > n/2) return k; } return-1; } };
排序(c++)
classSolution { public: intmajorityElement(vector<int>& nums){ int n = nums.size(); sort(nums.begin(), nums.end()); return nums[n/2]; } };
随机采样(c++)
classSolution { public: intmajorityElement(vector<int>& nums){ int n = nums.size(); while (1) { int idx = rand() % n; int cnt = 0; for (auto x : nums) { if (x == nums[idx]) cnt++; } if (cnt > n/2) return nums[idx]; } return-1; } };
分治(c++)
classSolution { public: intnumCount(vector<int>& nums, int x, int l, int r){ int cnt = 0; for (int i = l; i <= r; ++i) { if (nums[i] == x) cnt++; } return cnt; }
intfindMajority(vector<int>& nums, int l, int r){ if (l == r) return nums[l]; int m = l+(r-l)/2; int ml = findMajority(nums, l, m); int mr = findMajority(nums, m+1, r); if (ml == mr) return ml; int cl = numCount(nums, ml, l, r); int cr = numCount(nums, mr, l, r); return cl < cr ? mr : ml; }
intmajorityElement(vector<int>& nums){ int n = nums.size(); returnfindMajority(nums, 0, n-1); } };
摩尔投票(c++)
classSolution { public: intmajorityElement(vector<int>& nums){ int cand = 0, cnt = 0; for (auto x : nums) { if (!cnt) cand = x; if (x == cand) cnt++; else cnt--; } return cand; } };
classSolution: defmajorityElement(self, nums, lo=0, hi=None): defmajority_element_rec(lo, hi): if lo == hi: return nums[lo] mid = (hi-lo)//2+lo left = majority_element_rec(lo, mid) right = majority_element_rec(mid+1, hi) if left == right: return left left_count = sum(1for i inrange(lo, hi+1) if nums[i] == left) right_count = sum(1for i inrange(lo, hi+1) if nums[i] == right) return left if left_count > right_count else right return majority_element_rec(0, len(nums)-1)
摩尔投票(python)
classSolution: defmajorityElement(self, nums): count = 0 candidate = None for num in nums: if count == 0: candidate = num count += (1if num == candidate else -1) return candidate