多数元素(同归于尽消杀法)

📌 博客主页   爆打维c

点击开始答题:OJ链接


一、题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

二、思路

参考了大佬的同归于尽消杀法,觉得这题很好玩,下面给出本题思路

核心思想:

由于多数超过50%, 比如100个数,那么多数至少51个,剩下少数是49个。

1.先来到高地的士兵占领高地,此时领主 winner 就是这个阵营的人,cnt++,代表阵营人数+1

2.后一个士兵若跟前一个士兵同阵营,则集合起来占领高地,领主不变,阵营人数+1,否则同归于尽阵营人数-1。

3.若“同归于尽”后高地无人占领,则重复第一步。

4.最后胜者为多数阵营的士兵。

各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营,winner 就是多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

三、代码如下

#include<stdio.h>
int majorityElement(int* nums, int numsSize) {
    int winner = nums[0];   //刚来的士兵占据高地
    int cnt = 1;            //阵营人数+1
    int i = 0;
    for (i = 1; i < numsSize; i++) {
        if (nums[i] == winner) {  //若相同元素
            cnt++; //同阵营加1
        }
        else if (cnt == 0) {     //无人占据高地
            winner = nums[i];
            cnt++;
        }
        else  cnt--;             //不同元素相互消杀
    }
    return winner;
}
int main(){
    int arr[] = { -1,-1,-1,1,2,1 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    printf("%d", majorityElement(arr, sz));
    return 0;
}

今天的内容到这里就结束了,喜欢的话给博主一个赞鼓励一下吧🥳

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值