leetcode刷题之旅——169. Majority Element

来源:互联网 发布:linux 强行退出vim 编辑:程序博客网 时间:2024/05/29 07:55

        本周学习了分治法,所以准备在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;    }};

0 0
原创粉丝点击