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
原创粉丝点击