majority element

LeetCode题目, 题意:给定一个数组,该数组的主要元素是指的是总数超过数组一半的那个数。

方法1:采用”分而治之”的方法,时间复杂度为 O(NlogN)

主要思路是:左右两边通过递归求取主要元素后,判断是否相等,相等的话,直接返回该值,否则遍历判断两个元素那个是主要元素。


static int majorityelem(vector<int>& nums, int start, int end, bool & flag) {
    if( end -start ==0)
    {
        flag =1;
        return nums[start];
    }
    int mid = (start + end)/2;
    bool leftf=true, rightf= true;
    int left = majorityelem(nums, start, mid, leftf);
    int right = majorityelem(nums, mid+1, end, rightf);

    flag = leftf | rightf;
    if(left == right)
        return left;
    int leftcnt=0, rightcnt=0;
    for(int i=start; i<= end; i++)
    {
        if(nums[i] == left)
            leftcnt++;
        else if(nums[i] == right)
            rightcnt++;
    }
    int mmax  = (end - start +1)/2;
    if(leftcnt > mmax)
        return left;
    else if(rightcnt >mmax)
        return right;
    flag = false;
    return 0;
}

int majorityElement(vector<int>& nums) {
    bool flag= true;
    int length = nums.size()-1;
    return majorityelem(nums, 0, length, flag);
}

方法2:采用动态规划,时间复杂度为 O(N)

主要思路是:维护两个值,一个是当前认为的主要元素ele,另一个是对比记录ele出现的次数cnt,出现了加1,没有出现减1,这样,如果cnt大于0,很有可能ele就是主要元素,若ele小于1,说明不存在主要元素。


int majorityElement(vector<int>& nums) {
    int cnt=1, ele = nums[0];
    for(vector <int>::size_type i= 1; i!= nums.size(); i++)
    {
        if(nums[i] == ele)
            cnt++;
        else
            cnt--;
        if(cnt < 0)
        {
            cnt=1;
            ele=nums[i];
        }
    }
    if (cnt<0)
    {
        cout<<"error"<<endl;
        return -1;
    }
    cnt=0;
    for(vector <int>::size_type i= 1; i!= nums.size(); i++)
    {
        if(nums[i] == ele)
        {
            cnt++;
        }
    }
    if(cnt > nums.size()/2)
        return ele;
    else
    {
        cout<<"eror"<<endl;
        return -1;
    }
}

欢迎回帖讨论,提供意见或建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值