leetcode169
题目简介
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
示例 1:
输入: [3,2,3]
输出: 3
简单的来说就是给出数组中个数大于n/2的元素
解题思路
我们可以使用排序,将数组中的元素全部排序一遍,因为我们需要的数字个数大于n/2,因此数组中间的那个一定是我们需要的值
AC代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
其他题解
另外还有3种解法,分别为哈希法、moore投票、随机数
哈希表解法
在c++11中引入了hash-table,形式为unordered_map,其中的元素存储是无序的,但是你可以通过他们的键值寻找他们
如此题所示,我们如果对于map[n]++,n就是其键值,我们可以将n作为读取nums中的元素,然后在时间复杂度O(n)的情况下就可以得出
//哈希法代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map <int,int> mp;
for(int n:nums){
if(++ mp[n] > nums.size()/2){
return n;
}
cout << mp[n] << endl;
}
return -1;
}
};
(PS:但是似乎还是比sort的优化做的差,我实践来发现内存相差不大,但是时间要多不少)
moore投票
此方法经过我阅读以后,我认为又是针对于这个元素大于n/2的性质,因为大于一般,所以最终计数的值必定是大于等于1的,然后对应的就是答案的值
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count=0,candidate;
for(int n:nums)
{
if(count==0){
candidate=n;
}
if(n==candidate) count++;
else count--;
}
return candidate;
}
};
随机数
这个就是凑运气了,每次选取nums中的一个元素,查看他出现他的频率是否大于n/2
class Solution {
public:
int majorityElement(vector<int>& nums) {
while(true)
{
int candidate=nums[rand() % nums.size()],count=0;
for(int n:nums)
{
if(n==candidate)
count++;
}
if(count > nums.size()/2) return candidate;
}
return -1;
}
};