手机网站的模板下载软件/北京seo的排名优化
问题描述:
编写一个程序求解主要元素。(何为主要元素:当某个元素在数组中出现的次数大于数组个数的一半时,该元素即为主要元素)。
分析:这道题在leetcode上出现过,思想是如果将主要元素摞成一摞,然后将非主要元素摞成另一摞,因为主要元素的个数要占数组个数的一半以上,所以,非主要元素的高度一定小于主要元素的高度。那么一层一层的往下削,削到最后时还剩下的一定是主要元素。
现在的困难是我们并不知道谁是主要元素(废话)。那我们可以假设某个元素为候选元素,那么从前向后遍历,如果某值与候选元素相同,引用计数加1,否则-1,这样当引用计数变成0时,表示候选元素选错了,要重选。然后假设下一个点为候选元素。试想一下如果该元素为非主要元素,那么最后它一定会被主要元素抵消掉。
但是这样得到的结果仅仅是候选项还不能确保一定是主要元素,所以还需要再走一遍来验证结果正确与否
代码如下:
int getMainData(int *nums,int size) {if (size <= 0)return -1;int base = nums[0];int baseCount = 1;for (int i = 1; i < size; i++) {if (baseCount == 0) {base = nums[i];baseCount = 1;}if (nums[i] != base)baseCount--;elsebaseCount++; }//check if the real main dataint count = 0;for (int i = 0; i < size; i++) {if (nums[i] == base)count++;}if (count > size / 2)return base;return -1;
}