1. 程式人生 > >主元素(LintCode)

主元素(LintCode)

題目來源:LintCode

原題地址:http://www.lintcode.com/zh-cn/problem/majority-number/

題目:

給定一個整型陣列,找出主元素,它在陣列中的出現次數嚴格大於陣列元素個數的二分之一。

您在真實的面試中是否遇到過這個題? Yes 樣例

給出陣列[1,1,1,1,2,2,2],返回 1

挑戰

要求時間複雜度為O(n),空間複雜度為O(1)


難度級別:
容易
思路分析:
這道題還是蠻經典的,最容易想到的應該就是去數這裡面的每一個數都出現了幾次,然後把主元素找出來;
那麼,這個過程中,其實我們計算了所有數的出現次數,而實際上,我們只要其中主元素的次數就可以了,也就是說,我們做了很多的無用功。
根據
七月演算法
的周博提供的思路(劍指offer中也提到了),我們可以把這些數看做兩種型別,一種主元素,一種非主元素;如果每次我們都從這兩種型別中各拿走一個數,知道其中一種型別的數拿光,則最後,剩下的一種型別必定會是主元素型別。按照這種思路就可以來解此題,方便快捷。
實現程式碼:
class Solution
{
public:
	/**
	* @param nums: A list of integers
	* @return: The majority number
	*/
	int majorityNumber(vector<int> nums)
	{
		int cnt = 0;
		int result = 0;
		for (int i = 0; i < nums.size(); i++)
		{
			if (cnt == 0)
			{
				result = nums[i];
				cnt++;
			} else
			{
				if (result != nums[i])
				{
					cnt--;
				} else
				{
					cnt++;
				}
			}
		}
		return result;
	}
};


程式碼說明:
根據分析中所說的,分成兩堆,但是實際實現中,無法做到,所以我們每遍歷一個數,要先判斷是否當前是否有候選的數,若cnt不為零則result中的數就是候選的,若cnt為零則無候選,此時的新數就變成新的候選數;
如果有候選數的話,判斷候選數與新數是否相同,如果不同的話,則cnt減1,相當於分析中的兩類數同時拿走一個,如果相同的話,則cnt加1,相當於某一堆中多了一個數;