Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
class Solution {
public:int majorityElement(vector<int> &num) {
int majority = 0;
int times = 0;
for(int i=0;i<num.size();i++)
{
if (times==0)
{
majority = num[i];
times = 1;
}
else
{
if (majority==num[i])
{
times += 1;
}
else
{
times -= 1;
}
}
}
return majority;
}
};
这个问题之所以这么去做,原因是题目中给出了一个信息,说最多数的数目大于n/2下取整。怎么利用这个信息呢,对于任何一道题,信息非常关键。如果单单说找出个数最多的数,这道题就不能这么做了。既然有这个条件,那就说明,该数组中任何两个不同的数配对删除后最后剩下的肯定是个数最多的数。配对删除并不是指真的删除,只是让形似删除。找到一个跟现在指向的数majority相同的数,就让次数加1,找到一个和现在数不同的数时就次数减1,得到的times就是配对删除后majority的次数。一堆空话,我们来举个栗子:[a,b,c,d,a,a,b,a,d],先找到a,majority=a,次数times=1;然后b和a不一样,则times-1=0;重新majority=c,times=1;。。。直到找到a后,下一个仍是a,则times=2,依次类推。总之,就是先指向一个数,用times的减1来表征配对的删除,times记录删除不同配对后,最多数字出现的次数。
那对于n/k下取整的题来说,就找k个不同的配对删除。