题目
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
思路
1、投票法
投票法的大致思路是,假定数组首元素为多数元素,然后和它相同,则计数count++,否则count–,若计数count-1=0,则说明之前的相同元素数量和不同元素数量相等,则认为下一个元素为数组中的多数元素
举例[1,2,3,3,3,3,2]
(1)默认多数元素为1,此时遍历数组,首元素与多数元素相同,count变为1;
(2)第二个元素2,与多数元素不同,count不加,而是count-1,此时count变为0,说明这之前与多数元素相同和不同的元素数量相同(即默认多数元素为1,和1相同的数量与和1不同的数量一致),更改默认多数元素为3;
(3)第三个元素与多数元素相同,count+1,此时count=1;
(4)第四、五、六个元素…,count=4;
(5)第七个元素2,与多数元素不同,count-1,此时为3,仍不为0,则多数元素最终为3;
2、排序法
排序法的思路为,将数组所有元素进行排序,这里的排序算法不限,对于排序之后的数组,多数元素无论大小,必然会出现在数组的中间处(因为题目规定数量必须多于n/2)
求解方法
1、投票法
int majorityElement(vector<int>& nums) {//投票法
int count = 0;
int maj = nums[0];
cout << maj << endl;
for (int i = 0; i < nums.size() - 1; i++)
{
if (maj == nums[i])
{
count++;
cout << "++count=" << count << endl;
}
else if (--count == 0)
{
maj = nums[i + 1];
cout << "maj=" << maj << endl;
}
}
return maj;
}
2、排序法
int majorityElement1(vector<int>& nums) {//排序法,使用了快速排序
insert_sort(nums);
int half = nums.size() >> 1;
return nums[half];
}
void insert_sort(vector<int>&nums)
{
for (int i = 1; i < nums.size(); i++)
{
for (int j = i; (j>0) && (nums[j]<nums[j - 1]); j--)
{
swap(nums[j], nums[j - 1]);
}
}
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}