Majority Element (Java)

本文介绍了如何使用majority vote算法在O(n)时间复杂度和O(1)空间复杂度下找到数组中出现次数超过一半的元素。通过flag计数器实现算法逻辑,即使在特殊情况下也能准确找出多数元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

这道题主要考察了majority vote Algorithm,该算法的时间复杂度为o(n),空间复杂度为o(1),与哈希方法时间复杂度相同,比哈希空间复杂度小,适合处理元素较大的情况,但该算法只适合于已知有元素个数大于1/2的情况,不能用于找最多元素的个数(不能保证最多元素个数大于整体的1/2)

算法思想:flag=第一个元素,count=1,从第二个开始,如果num[i]==flag那么count+1,如果不等且count!=0时,count-1,如果count=0,则flag=num[i]。即flag所指元素后面的元素,如果与此元素相等,则计数器加1,如果不等就减1,直至计数器为0时就更换为目前的元素。

特殊情况如 ABACADA 加一次减一次直至flag=最后一个A为止,count=1。那么A即为所求元素。倘若没有最后的A,ABACAD,该算法则找不到最多的那个元素,即没有大于1/2的数。

Source

public class Solution {
    public int majorityElement(int[] num) {
        int flag = num[0];
        int cnt = 1;
        for(int i = 1; i < num.length; i++){
            if(cnt == 0) flag = num[i];
            if(num[i] != flag) cnt--;
            else cnt++;
            
        }
        return flag;
    }
}



Test

public static void main(String[] args){
		int[] num = {2,3,5,2,2,3,4,2,2};   //注意数组初始化方式    int[] a = new int(n);
		System.out.println(new Solution().majorityElement(num));
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值