力扣-169-多数元素

直达链接

最直接的做法是扫一遍,统计每个数字出现的次数,可以用hashmap

怎么获取hashmap中值最大的元素?

可以排序,然后双指针滑动窗口,保存最大长度和对应的数字
…算是时间复杂度O(N),空间O(1)吧

 class Solution {
 public:
	 int majorityElement(vector<int>& nums) {
		 sort(nums.begin(), nums.end());
		 int i = 0, major = nums[0], frequency = 1,maxFrequency =1;

		 for (int j = 1; j < nums.size() - 1; j++) {
			 if (nums[j] == nums[i]) frequency++;
			 else {
				 frequency = 1;// 重新计数长度
				 i = j;// 重置左指针
			 }
			 if (frequency > maxFrequency) {
				 maxFrequency = frequency;
				 major = nums[i];
			 }
		 }
		 return major;
	 }
 };

我想用双指针,但是似乎哪里出问题了,在最后一个窗口,即当遍历到数组的最后一个元素时,没能妥善更新major

官方题解

哈希表

统计各数字出现次数,并用两个变量保存出现最多的元素和最多出现次数

	 // 时间复杂度一次遍历O(N),空间复杂度O(n)
	 int majorityElement(vector<int>& nums) {
		 unordered_map<int, int> counts;
		 // 分别用于记录最大元素值和最大出现次数
		 int marjority = 0, count = 0;
		 // 遍历整个数组,对其中元素出现次数进行计数
		 for (int num : nums) {
			 ++counts[num];
			 // 用一个变量来保存最大的出现次数
			 // 当某元素出现次数大于这个值时,就更新,同时记录最大元素是谁
			 if (counts[num] > count) {
				 marjority = num;
				 count = counts[num];
			 }
		 }
		 return marjority;
	 }

排序

因为多数元素出现次数大于n/2,所以排序后下标为n/2的元素一定是marjority

如果自己编写堆排序,可以达到O(1)空间复杂度

这样看来排序之后还不用像我想的一样滑动窗口了

分治

用类似归并排序的思想来找众数,感觉一下子复杂了好多…这不是正常人会做的吧

投票算法

必须是出现次数大于n/2才能这么做

 class Solution {
 public:
	 // 投票算法
	 int majorityElement(vector<int>& nums) {
		 // 准备一个候选人和他的票数记录
		 int candidate = nums[0], count = 1;
		 // 遍历整个数组,与候选人一致就+1,否则减一
		 for (int i = 1; i < nums.size(); i++) {
			 if (nums[i] == candidate) count++;
			 else count--;
			 // 如果票数归零,就换人,并且重新开始计票
			 if (!count) {
				 candidate = nums[i];
				 count = 1;
			 }
		 }
		 return candidate;
	 }
 };
posted @ 2022-09-07 16:41  YaosGHC  阅读(42)  评论(0)    收藏  举报