Boyer_Moore算法(多数投票算法)

该算法的原理非常的巧妙,主要是利用主要元素要在数组中超过半数,所以就可以这样操作:

设置一个计数器,每次遇见主要元素加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;
}

猜你喜欢

转载自blog.csdn.net/c_living/article/details/79443123