标签:算法-数据结构
LeetCode题目, 题意:给定一个数组,该数组的主要元素是指的是总数超过数组一半的那个数。
主要思路是:左右两边通过递归求取主要元素后,判断是否相等,相等的话,直接返回该值,否则遍历判断两个元素那个是主要元素。
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);
}
主要思路是:维护两个值,一个是当前认为的主要元素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;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:算法-数据结构
原文地址:http://blog.csdn.net/yunlliang/article/details/46659331