该算法的原理非常的巧妙,主要是利用主要元素要在数组中超过半数,所以就可以这样操作:
设置一个计数器,每次遇见主要元素加1,遇见其他任何的元素就减1,可想而知,因为多数元素是主要元素,最后肯定会是一个正数,那么利用这个就可以找出那个主要元素。那么问题就是如何让主要元素等于1,其他的元素等于-1.
举例说明:
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]以此数组为例子来说明该方法如何的巧妙的完成上述的难题额,我们可以换个角度来思考这个问题,既然让主要元素是1并且最终会胜利,那么我们设置一个count计数器,让每次count为0时候遇见的元素,假设为主要元素,那么每次遇见该元素就加1,其他元素就减1。那么显然会出现两种情况:
情况一:
该元素是主要的元素,那么顺理成章完成任务。
情况二:
该元素并不是主要元素,那么主要元素肯定会处在外面,并且,主要元素是占有大多数,因为我们是利用的+1和-1来进行抵消的,那么+1,-1抵消的元素必然相等,最坏的情况下就是此时我们以为的“非主要元素”全部是主要元素,那么真实的主要元素减少和真实的非主要元素减少一样多,这样真实的主要元素还是会占据优势。那么下面就是重复这两种情况了。
如该例子,第一个我们假定的主要元素是7,走到1的时候计数器为0,那么我们让5成为主要元素,到7结束。我们接着让5成为主要元素,7结束。后面剩余的全部是7,我们是需要返回7即可。
代码:
int majorityElement(int* nums, int numsSize) {
int count = 0;
int target = nums[0];
for(int i = 0;i < numsSize;i++)
{
if(count == 0)
{
target = nums[i];
}
if(nums[i] == target)
count++;
else
count--;
}
return target;
}