给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的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中的特殊情况检验了一下,输出正确。大概是比上一个算法更好一点的方法。同样欢迎讨论欢迎纠错。