No.169 Majority Element

    xiaoxiao2021-03-25  117

    思路一

    (1)首先将给定的数组排序,使得数组的元素从小到大排列,相同的元素处于相邻的位置,然后计算相同元素的个数,如果不足n/2,则计算下一个数的个数,如果超过n/2,则返回该元素。

    class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(),nums.end()); int count=0; int temp=nums[0]; for(int i=0;i<nums.size();i++){ if(nums[i]==temp){ count++; } else{ temp=nums[i]; count=1; } if(count>(nums.size()/2)){ break; } } return temp; } };

    (2)使用map存储数据,用nums中的值作为关键字,nums中的值出现的次数为值存入map中。在每次对map中的值加一之后,对其进行检测,如果大于n/2,则返回该元素的关键字。

    class Solution { public: int majorityElement(vector<int>& nums) { map<int,int> count; for(int i=0;i<nums.size();i++){ if(++count[nums[i]]>(nums.size()/2)) return nums[i]; } } }; 思路二:

    分治思想,将原数组分成两部分,分别计算左部分与有部分出现次数最多的元素,然后计算两个元素在整个数组中出现的次数,最终选出原数组中出现次数最多的元素。注意:题目中指出出现数目最多的元素出现次数超过⌊ n/2 ⌋次,这保证出现数目最多的元素在分两组之后,在左或右分组中一定是出现数目最多的元素。

    class Solution { public: int majorityElement(vector<int>& nums) { return majority(nums, 0, nums.size() - 1); } private: int majority(vector<int>& nums, int left, int right) { if (left == right) return nums[left]; int mid = left + ((right - left) >> 1); int lm = majority(nums, left, mid); int rm = majority(nums, mid + 1, right); if (lm == rm) return lm; return count(nums.begin() + left, nums.begin() + right + 1, lm) > count(nums.begin() + left, nums.begin() + right + 1, rm) ? lm : rm; } };
    转载请注明原文地址: https://ju.6miu.com/read-25213.html

    最新回复(0)