因为学校老师布置的人物所以学习算法搁置了一段时间,今天写了一道比较简单的题目,下面是题目和链接:
题目:给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/majority-element
我的思路:
先用快排给数组排个序,方便之后记数;
如果数组长度为1直接返回;
倒序开始计算数组元素出现次数(采用倒序是因为为了避免数组越界访问的问题),每个数组只有一个多数元素,所以如果计数变量超过数组长度1/2就可以返回啦,否则继续,统计完一个数组元素出现次数后,统计下一个时要将记数变量归1,下面是具体代码;
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
int a=1,len = nums.size();
if(len==1){
return nums[0];
}
for(int i=len-1;i!=0;i--){
if(nums[i]==nums[i-1]){
a++;
}else if(nums[i]!=nums[i-1]){
a=1;
}
if(a>nums.size()/2){
return nums[i];
}
}
return -1;
}
};
我的思路2.0:写完习惯逛评论区,看到了很多不同的解法(位运算、直接调用api、哈希数组),最感兴趣的还是摩尔投票法,如果议员参选,信仰a的民众超过投票总数的一半,假设投的票可以相互抵消,投a一票抵消投其他人的一票,那么最后因为人数优势,a会当选。
所以我在原本的代码上根据这个想法小修了一下,我假设每个元素的需要次数就是数组长度的一半,然后如果遇到相同的元素那就-1,当记数变量为0时返回,否则继续,下面时代码实现:
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
int a=nums.size()/2,len = nums.size();
if(len==1){
return nums[0];
}
for(int i=len-1;i!=0;i--){
if(nums[i]==nums[i-1]){
a--;
}else if(nums[i]!=nums[i-1]){
a=nums.size()/2;
}
if(a<=0){
return nums[i];
}
}
return -1;
}
};