标签:stl always markdown end 排序 nlog 中间 高效 tor
一. 题目描写叙述
Given an array of size n, find the majority element. The majority element is the element that appears more than ? n/2 ?
times.
You may assume that the array is non-empty and the majority element always exist in the array.
二. 题目分析
题目说到,给定一个数组。内含n
个元素。找出一个主元素,该元素在数组中出现的次数比其它元素出现的次数加起来还要多。即该元素的数量大于n/2
。
開始的思路,自然是对数组进行排序,数组最中间的元素就是主元素,但算法复杂度一般须要:O(nlogn)
;若同意辅助内存。可新建一个数组。用于存放不同元素值在数组中存放的次数。这样仅仅需遍历一次原数组,然后再遍历一次记录次数的数组就可找出主元素。算法复杂度为O(n)
。
一种高效的方法仅仅需遍历一次数组就可以。
我们知道主元素出现的次数比其它元素出现的次数和还要大,因此,仅仅需使用两个变量:candidate
和 count
这两个变量记录了元素candidate
的值,count
记录了元素candidate
比其它元素多出现的次数。
遍历数组,遇到与当前记录元素candidate
同样的元素值,++count
;否则count
被抵消一次。--count
。当count
变为0
时,更换candidate
为当前遍历所在的像素值。
由于遍历完数组后,主元素被抵消的次数count
比然大于零,不会由于当count
变为0
而被其它数组元素替代。因此candidate
也仅仅会是主元素。
三. 演示样例代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = 0, count = 0;
for (int i = 0; i < nums.size(); ++i)
{
if (count == 0)
{
candidate = nums[i];
++count;
}
else
{
if (candidate == nums[i])
++count;
else
--count;
}
}
return candidate;
}
};
标签:stl always markdown end 排序 nlog 中间 高效 tor
原文地址:http://www.cnblogs.com/lytwajue/p/7152519.html