leetcode刷题之旅——169. Majority Element

        本周学习了分治法,所以准备在leetcode中挑选几道分治算法的题目来写。然而分治算法题目当中只有一道是easy,其他都是middle或者hard的题目,让我很慌。所以先把这唯一一道easy的题目写出来,给自己长点自信。

        这道题目的意思就是从一个数组当中找到出现次数大于n/2的那个数,即题目当中给我们的主元素。

        先说一下对于这道题目,我的分治算法是怎样的。首先,我们把这一个数组分为两个数组,S1和S2。这样,我们就把这个问题分解成了更小规模的相同问题,即在S1和S2中分别找到主元素。那么就会出现两种情况,当S1和S2中的主元素相同的情况下,毫无疑问,总的数组当中的主元素就是这个数。但是另一种情况就是,这两个主元素并不相同,那我们应该怎么办呢?我想不到更好的方法,只能重新搜索一下整个数组,看到底哪个是真正的主元素。

        这道题的做法有很多种,如果采用分治法来做这道题目的话,复杂度是O(nlogn)。根据上周课上的内容来看,T(n)=2T(n/2)+2O(n)是这道题的推导公式,而Master theorem告诉我们这道题的复杂度就是O(nlogn)。当然我最开始想到的并不是分治法,我想的是将数组排序,记录出现次数最多的那个就一定是主元素,这种做法很容易实现,就不再赘述了。

        下面贴出来我写的源代码:

class Solution 
{
public:
    int majorityElement(vector<int>& nums) 
    {
        return dc(nums,0,nums.size()-1);
    }
    int dc(vector<int>& nums,int begin,int end)
    {
        if(begin==end) return nums[begin];
        int left,right;
        if(begin<end)
        {
            int mid=(begin+end)/2;
            left=dc(nums,begin,mid);
            right=dc(nums,mid+1,end);
            if(left==right) return right;
            else 
            {
                int lcount=0;
                int rcount=0;
                for(int i=begin;i<=end;i++)
                {
                    if(nums[i]==left) lcount++;
                    else if(nums[i]==right) rcount++;
                }
                if(lcount>rcount) return left;
                else return right;
            }
        }
        return right;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值