📌 博客主页 爆打维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;
}
今天的内容到这里就结束了,喜欢的话给博主一个赞鼓励一下吧🥳