原题链接:https://leetcode-cn.com/problems/majority-element/
此题需要我们找的就是数组中出现次数大于数组长度一半的数字,并且保证该数字一定存在
如何找出来的,有些想法是将数组进过排序后,查找连续相等最长的那个数字即可
比如数组[2,2,1,1,1,2,2]经过排序后得到[1,1,1,2,2,2,2],那么接下来只需要遍历判断那个数字连续相等最长即可
但是此处我们不按照这个思路来写,因为可以发现的是,一个排序的算法时间复杂度就已经够高了,还要在遍历一遍数组,时间复杂度绝对大于O(n)
那么如何去做呢?既然题中已经保证了这个数字的存在性,那么我们假设一个场景,魏蜀吴三国士兵打擂台
蜀国士兵7人,魏国士兵3人,吴国士兵2人
我们可以先随机让一个士兵上擂台,比如魏国士兵
它是第1个上台的,那就让他先站着,然后随机再上来第2个士兵,比如蜀国士兵,把他干下去了
接着第3个士兵,也是蜀国的,那就这俩人都在这站着
第4个士兵,吴国的上台,他只能干掉一个蜀国的,然后自己也被另一个蜀国的干掉了,此时擂台还剩一个蜀国的
第5个士兵,魏国的上台,干掉蜀国的
第6个士兵,魏国的上台,那就接着站那
第7个士兵,最后一个吴国的上台,他只能干掉一个魏国的,自己也就B了
第8个士兵,蜀国的上台,干掉最后一个魏国的
接着就不用说了吧,蜀国的不能干蜀国的,那么最终在擂台上剩的是谁,谁就是我们需要的那个多数元素
总结一下
- 先上来一个士兵,计数1
- 之后上来的士兵如果和已在擂台上的士兵国籍相等,计数+1
- 之后上来的士兵如果和已在擂台上的士兵国籍不等,计数-1,如果计数变为0,则后者留在擂台并重新计数为1
按照上述流程和条件,最终擂台上所剩的士兵是哪个国籍,那么这个国籍就是我们的多数元素,应该明白了吧
那么用数字表示国籍的话,是不是很简单了?来看代码吧
class Solution {
public int majorityElement(int[] nums) {
int number=nums[0];
int count=1;
for(int i=1;i<nums.length;i++){
if(nums[i]==number){
count++;
}else{
count--;
if(count==0){
number=nums[i];
count=1;
}
}
}
return number;
}
}