您的位置:首页 > 其它

[leetcode]解决Majority Element的一点小心得

2017-09-09 20:00 225 查看
本次选择的题目是

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.

1.解决这个问题最直接的方法是构造映射,将数字与出现次数对应起来,但问题是数组不能涵括无限的样例,所以这里采用map方法,这里我使用了
unorder_map
的特性。

unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。

不同的是unordered_map不会根据key的大小进行排序,存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。

所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些,那么如果是自定义类型,那么就需要自己重载operator<或者hash_value()了。

结论:如果需要内部元素自动排序,使用map,不需要排序使用

unordered_map
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
int n = nums.size();
for (int i = 0; i < n; i++)
if (++counts[nums[i]] > n / 2)
return nums[i];
}
};


2.使用Divide and Conquer,不断二分数组,统计每个小数组的majority。

class Solution {
public:
int majorityElement(vector<int>& nums) {
return majority(nums, 0, nums.size() - 1);
}
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;
int l_m = count(nums.begin() + left, nums.begin() + right + 1, lm);
int r_m = count(nums.begin() + left, nums.begin() + right + 1, rm);
return l_m > r_m ? lm : rm;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: