Majority Element
生活随笔
收集整理的這篇文章主要介紹了
Majority Element
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Given an array of size?n, find the majority element. The majority element is the element that appears more than?? n/2 ??times.
You may assume that the array is non-empty and the majority element always exist in the array.
給定size 為n的數組,查找出主元素,就是出現次數大于n/2次的元素。你可以假定數組非空,而且主元素一定存在。
class Solution { public:int majorityElement(vector<int>& nums) {map<int, int> im;for (int i = 0; i < nums.size(); ++i){map<int, int>::iterator it = im.find(nums[i]);if (it == im.end()) {im[nums[i]] = 1;} else {im[nums[i]]++;}if (im[nums[i]] > nums.size()/2) {return nums[i];}}return 0;} };
有一種算法叫 Moore’s Voting Algorithm,由Robert S.Boyer 和J Strother Moore于1980年發明,是線性時間復雜度。
int majorityElement(vector<int> &num) {int majority;int cnt = 0;for(int i=0; i<num.size(); i++){if ( cnt ==0 ){majority = num[i];cnt++;}else{majority == num[i] ? cnt++ : cnt --;if (cnt >= num.size()/2+1) return majority;}}return majority; }當然,這種算法對于存在主元素的數組是有效的,如:
A A A C C B B C C C B C C
它肯定能返回主元素C。但是,如果不存在主元素,那么得到的結果就跟遍歷順序有關了。如:
A A A C C C B
如果是從左到右,那么結果是B,如果是從右到左,那么結果是A。
class Solution { public:int majorityElement(vector<int>& nums) {int n = nums.size(); sort(nums.begin(),nums.end()); return nums[n/2]; } };#include<iostream> #include<vector> #include<algorithm> #include<map> using namespace std; int major(vector<int>); int main() {vector<int>a = { 1, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2, 2, 2 };cout << major(a) << endl;system("pause");return 0;} int major(vector<int> a) {/*sort(a.begin(), a.end());return a[a.size() / 2];*//*map<int, int> m;for (int i = 0; i < a.size(); i++){if (m.find(a[i]) == m.end()){m[a[i]] = 1;}else{m[a[i]]++;}if (m[a[i]]>a.size() / 2)return a[i];}*///標志位想減法 可以判斷出現次數做多數int major;int num = 0;for (int i = 0; i < a.size(); i++){if (num == 0){major = a[i];num++;}else{if (major != a[i])num--;else{num++;}}if (num > a.size() / 2) return major;}}
總結
以上是生活随笔為你收集整理的Majority Element的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Roman to Integer
- 下一篇: Factorial Trailing Z