主元素III

题目八:

给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k

注意事项

数组中只有唯一的主元素

样例

给出数组 [3,1,2,3,2,3,3,4,4,4] ,和 k = 3,返回 3

代码:

struct Main
{
    int num;
    int time;
    Main *left;
    Main *right;
};
int MaIn;
class Solution {
public:
    /*
     * @param nums: A list of integers
     * @param k: An integer
     * @return: The majority number
     */
    int majorityNumber(vector<int> &nums, int k) {
        // write your code here
        int size = nums.size()/k;
        Main *root;//建立根节点
        root = new Main;
        root->num = nums[0];
        root->time = 1;
        root->left = NULL;
        root->right = NULL;
        for(int i = 1;i<nums.size();i++)
        {
            Get(nums[i],size,root);
        }
        return MaIn;
    }
    void Get(int number,int size,Main *root)
    {
        Main *p;
        if(root == NULL)
        {
            return;
        }
        if(number>root->num)
        {
            if(root->right == NULL)
            {
                p = new Main;
                p->num = number;
                p->time = 1;
                p->left = NULL;
                p->right = NULL;
                root->right = p;
                return;
            }
            else
            Get(number,size,root->right);
        }
        else if(number<root->num)
        {
            if(root->left == NULL)
            {
                p = new Main;
                p->num = number;
                p->time = 1;
                p->left = NULL;
                p->right = NULL;
                root->left = p;
                return;
            }
            else
            Get(number,size,root->left);
        }
        else if(number== root->num)
        {
            root->time++;
            if(root->time>size)
            {
                MaIn = root->num;
                return;
            }
        }
    }
};

主元素i和主元素ii的升级版,首先想到的是把主元素二的代码改一下提交上去,不幸的是失败了,然后我琢磨了许久琢磨出一个新的思路,建立一棵二叉树。

这个想法是这样来的。题目是:找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k,这个k是不确定的,也就是说用之前的定量的方法是很有困难的,需要考虑的情况就更多,所以我打算找一种方法能够直接获得每个元素出现的频数,与size=nums.size()/k进行比较。一开始想选择快速排序,感觉,并没有什么帮助(好吧是我快速排序用的不是很熟练,写到一半蒙掉了)然后琢磨了一下,还是二叉树相对于我来说简单一点,我想的是在二叉树中比较,对于每个子树的根节点来说可以减少一棵子树的比较。这样的话需要的时间应该是更少一点(因为这个算法是写完以后一次就Accepted,我也不能完全确定它的时间消耗是不是想我想的这样)。下面是算法详解:

nums[0]作为根节点,数组中其余元素递归的与二叉树中各个节点进行比较,对于每一棵子树,大于根节点的连在右子树(递归建立右子树),小于根节点的连在左子树(递归建立左子树),与根节点相同的根节点的time增加,同时判断time与size的大小关系,大于则结束程序,找到主元素。

全局变量MaIn存储找到的主元素。

这个算法我用之前主元素II中的特殊情况检验了一下,输出正确。大概是比上一个算法更好一点的方法。同样欢迎讨论欢迎纠错。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值