多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
分治解法:将数组分成左右两部分,分别求出左半部分的众数 a1 以及右半部分的众数 a2,随后在 a1 和 a2 中选出正确的众数
代码:

class Solution {
int count_in_range(vector<int>&nums, int find, int left, int right){
int c = 0;
for(int i = left; i <= right; i++)
if(nums[i] == find)
++c;
return c;
}
int majority_element_rec(vector<int>&nums, int lo, int hi) {
if (lo == hi)
return nums[lo];
int mid = (lo + hi) / 2;
int left_majority = majority_element_rec(nums, lo, mid);
int right_majority = majority_element_rec(nums, mid + 1, hi);
if (count_in_range(nums, left_majority, lo, hi) > (hi - lo + 1) / 2)
return left_majority;
if (count_in_range(nums, right_majority, lo, hi) > (hi - lo + 1) / 2)
return right_majority;
return -1;
}
public:
int majorityElement(vector<int>& nums) {
int me = majority_element_rec(nums, 0, nums.size()-1);
return me;
}
};
注意穿参数vector<int>num时要加上&,不然会超时。
普通解法:
代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int, int>m;
int max = 0, maxn;
for(int i=0; i<nums.size(); i++){
m[nums.at(i)]++;
if(m[nums.at(i)] > max){
max = m[nums.at(i)];
maxn = nums.at(i);
}
}
return maxn;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
排序解法:
代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};
对数列进行排序时简化问题的一种手段
摩尔投票算法:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (int num : nums) {
if (num == candidate)
++count;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}
};
摩尔投票是一种用来解决绝对众数问题的算法。
在一个集合中,如果一个元素的出现次数比其他所有元素的出现次数之和还多,那么就称它为这个集合的绝对众数。等价地说,绝对众数的出现次数大于总元素数的一半。
摩尔投票的过程非常简单,让我们把找到绝对众数的过程想象成一次选举。我们维护一个 ,表示当前的候选人,然后维护一个
。对于每一张新的选票,如果它投给了当前的候选人,就把
加1,否则就把
减1(也许你可以想象成,B的一个狂热支持者去把A的一个支持者揍了一顿,然后两个人都没法投票)。特别地,计票时如果
,我们可以认为目前谁都没有优势,所以新的选票投给谁,谁就成为新的候选人。
————— c++数组和vector的选择 ———————————
在对数据进行频繁访问执行操作时,数组比vector优秀很多。
但是,这不是说数组一定比vector好,vector拥有很多强大的功能,可以存储很多种类型,相比之下数组还是太单一了点,如果只是对一组数据进行简单的频繁访问执行操作,可以c++数组,否则大多数情况都还是使用c++的vector。

浙公网安备 33010602011771号