LeetCode刷题篇—169.多数元素

LeetCode刷题篇—169.多数元素

题目

给定一个大小为 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;
	}

猜你喜欢

转载自blog.csdn.net/guo_xyx/article/details/114293641