Majority Element I&II | Leetcode
来源:互联网 发布:淘宝发错货还用退回吗 编辑:程序博客网 时间:2024/06/05 02:01
Majority Element I
题意
题目很简单,就是找出数组中出现次数超过一半的数。第一个想到的方法就是给数组排序,既然出现的次数超过一半,那么中间那个数必然就是答案。当然这也的效率还是不够高,是O(nlogn).是否还有更加高效的方法?的确如此,我们可使用一对变量,分别记录数字以及数字出现的次数,每当扫描的数不等于当前记录数字的时候,就将次数减一,一旦出现次数等于0,就将数字换成当前扫描的数字,经将出现次数开始叠加。
原理
既然出现的次数过半,那么用该数逐步和其他数一一抵消,那么最后遗留的数就是我们想要的答案。下面给出两种方法的代码实现。
代码实现
class Solution {public: //40ms int majorityElement1(vector<int>& nums) { sort(nums.begin(),nums.end()); return nums[(nums.size()-1)/2]; } //16ms int majorityElement(vector<int>& nums) { int num,count=0; int size=nums.size(); for(int i=0;i<size;++i){ if(count==0){ num=nums[i]; ++count; }else if(num==nums[i]){ ++count; }else --count; } return num; }};
上面两种方法的效率对比还是很明显,第二种更加优秀和高效。下面看这个题目的升级版。
Majority Element II
解题思路
题目和原题差不多,只不过这回出现的次数只要超过1/3都返回。我们首先需要明确的就是这样的数有多少个。每个数出现的次数都要超过1/3,所以最多不会超过两个这样的数。所以我们仍然可以使用第一题当中使用的方法,这次我们使用两对变量,逐步抵消,最后必然就会剩下两个数。结果必定是这两个当前的一个或者两个。逐步统计一下这两个数出现的次数就可以得出答案。代码实现如下:
class Solution {public: //最多就2个,比如测试出现[1,1,2,2,3,3],结果返回为空 vector<int> majorityElement(vector<int>& nums) { vector<int> res; int count1=0,count2=0,can1=INT_MAX,can2=INT_MAX; int num1=0,num2=0; // int size = nums.size(); for(int num:nums){ if(num==can1){ ++count1; }else if(num==can1){ ++count2; }else if(count1==0){ can1=num; count1=1; }else if(count2==0){ can2=num; count2=1; }else{ --count1; --count2; } } count1=count2=0; for(int n: nums){ if (n==can1) ++count1; else if(n==can2) ++count2; } vector<int> result; if (count1 > nums.size()/3) result.push_back(can1); if (count2 > nums.size()/3) result.push_back(can2); return result; }};
0 0
- LeetCode Majority Element I && II
- Majority Element I&II | Leetcode
- Leetcode Majority Element I&II
- leetcode笔记--Majority Element I & II
- LeetCode:Majority Element I II 投票算法
- Majority Element I, II
- [LeetCode] Majority Element II
- [leetcode] Majority Element II
- #leetcode#Majority Element II
- 【LeetCode】Majority Element II
- LeetCode Majority Element II
- LeetCode - Majority Element II
- LeetCode Majority Element II
- leetcode: Majority Element II
- [LeetCode] Majority Element II
- leetcode--Majority Element II
- LeetCode-Majority Element II
- Leetcode: Majority Element II
- C++primer--拷贝控制__构造函数和析构函数的执行时期
- C语言冒泡排序及选择排序优化<代码>
- 深入理解计算机系统 1.8 系统通过网络与其它系统交流
- 轻松学习JavaScript十七:JavaScript的BOM学习(二)
- PHP访问MySQL几种方法
- Majority Element I&II | Leetcode
- 关于微信原生支付(扫码支付)的两种支付模式的理解和比较...
- ListView子布局样式有多个的处理
- 【LEETCODE】205-Isomorphic Strings
- OC学习_3_关于封装
- HDU 1257 最少拦截系统 贪心
- php-简单计算器
- zzulioj--1807--小明在努力(递归)
- Linux VI常用命令