博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode——229. Majority Element II
阅读量:4137 次
发布时间:2019-05-25

本文共 3463 字,大约阅读时间需要 11 分钟。

题目

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

Hint:

How many majority elements could it possibly have?

Do you have a better hint? Suggest it!

解答

给一个大小为n的数组,找出所有的出现次数超过n/3的元素。

算法要求是线性时间,即O(N),O(1)的空间复杂度。

这一题印象深刻!!!因为它的解法太巧妙了,每次想起都会赞叹不已!

解决方法:摩尔投票法!!!

思想就是寻找这个数组中出现次数最多的两个元素(只有两个有可能是大于n/3)。
然后看这两个元素的出现次数是否超过n/3,超过就加入结果中,否则,舍弃。
那么如何求出现次数最多的两个元素呢?
看代码,很简单:

int m=0,n=1,count_m=0,count_n=0;for(auto elem:nums)//相当于nums[i]。这一步很重要,也很巧妙!是寻找数组中最多的两个元素。{    if(elem==m) count_m++;    else if(elem==n) count_n++;    else if(!count_m) m=elem,count_m=1;    else if(!count_n) n=elem,count_n=1;    else count_m--,count_n--;}

然后重新遍历,再次计数

count_m=0,count_n=0;for(auto elem:nums){    if(elem==m) count_m++;    else if(elem==n) count_n++;}if(count_m>size_n/3) res.push_back(m);if(count_n>size_n/3) res.push_back(n);

AC代码:

class Solution {
//摩尔投票法,n=3的情形public: vector
majorityElement(vector
& nums) { vector
res; int size_n=nums.size(); //if(size_n==0) return res;//这一步其实也不需要 /*if(size_n==1) //经过验证,其实不需要这一个判断 { res.push_back(nums[0]); return res; }*/ //处理个数大于等于2的情形 int m=0,n=1,count_m=0,count_n=0; for(auto elem:nums)//相当于nums[i]。这一步很重要,也很巧妙!是寻找数组中最多的两个元素。 { if(elem==m) count_m++; else if(elem==n) count_n++; else if(!count_m) m=elem,count_m=1; else if(!count_n) n=elem,count_n=1; else count_m--,count_n--; } count_m=0,count_n=0; for(auto elem:nums) { if(elem==m) count_m++; else if(elem==n) count_n++; } if(count_m>size_n/3) res.push_back(m); if(count_n>size_n/3) res.push_back(n); return res; }};

扩展

当n=4,5,6…k时,方法也是如此

比如n=5
代码未经过验证

class Solution1 {
//摩尔投票法,n=5的情形public: vector
majorityElement(vector
& nums) { vector
res; int size_n = nums.size(); //if(size_n==0) return res;//这一步其实也不需要 /*if(size_n==1) //经过验证,其实不需要这一个判断 { res.push_back(nums[0]); return res; }*/ //处理个数大于等于5的情形 //暂时不对异常进行处理 int m = 0, n = 1, count_m = 0, count_n = 0; int Data[5] = { 0 }; int DataNum[5] = { 0 }; for (auto elem : nums)//相当于nums[i]。这一步很重要,也很巧妙!是寻找数组中最多的两个元素。 { bool flag = 1; for (int j = 0; j < 5; j++) { if (elem == Data[j]) { DataNum[j]++; flag = 0; break; } } for (int j = 0; flag&&j < 5; j++) { if (!DataNum[j]) { Data[j] = elem; DataNum[j]=1; flag = 0; break; } } for (int j = 0; flag&&j < 5; j++) { Data[j]--; } } for (int j = 0;j < 5; j++) { DataNum[j]=0; } for (auto elem : nums) { for (int j = 0; j < 5; j++) { if (elem == Data[j]) { DataNum[j]++; } } } if (count_m>size_n / 5) res.push_back(m); if (count_n>size_n / 5) res.push_back(n); return res; }};

转载地址:http://xexvi.baihongyu.com/

你可能感兴趣的文章
组队总结
查看>>
TitledBorder 设置JPanel边框
查看>>
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>