A. 求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
分析:
这里有一个叫做摩尔投票法的方法,用于求众数。是一种非常优秀的方法。这种投票法先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。
这种算法的核心是:在任何数组中,出现次数大于该数组长度的一半的数字只能有一个。
那么如果计数器减为零的话,就说明当前这个数肯定没有到达当前数组长度的一半,那么肯定不是要找的众数,那么就舍去(以后如果还有这个数的话,那么计数器一定不为0)
由此得解。
代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int cnt = 0;
int ans = 0;
for(int i = 0; i < nums.size(); i++)
{
if(cnt == 0)
{
ans = nums[i];
cnt++;
}
else
{
ans == nums[i]?cnt++:cnt--;
}
}
return ans;
}
};
B. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入:[2,2,1]
输出:1
示例 2:
输入:[4,1,2,1,2]
输出:4
分析:
emmmm...其实Leetcode上面好多题都可以暴力......但是这道题你看,明确告诉你了除了一个元素外,其他的元素都出现了两次。两次是个啥意思?就是可以通过一定方式抵消的意思啦!
那么学过的知识中,异或可以抵消两个相同的数字!那就分分钟秒杀好了!
然而做题的时候并没有秒杀。。。自行百度了。。。。。。宛如智障般的存在这就是我了hhh
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for(int i = 0; i < nums.size(); i++)
{
ans ^= nums[i];
}
return ans;
}
};