标签:
题目描述:给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
样例:给出数组[1,2,1,2,1,3,3] 返回 1
之前,有果一道“主元素”的问题(详见:点击打开链接),我们用的是“消去法”,因为主元素的个数大于元素总数的二分之一,可以保存只有一个元素的hash表,通过消去法解决。
现在条件变了,变成大于三分之一了。那么可以采用相似的消去的办法,令哈希表存储两个数据,每个数据有它自己的计数,每次消去的是一个计数较小的数据(令计数减一),当这个数据被完全抵消,就用新的数据替换。这样,我们可以只用一次遍历,得到两个数。
拿样例来说,步骤如下:
1. 初始化sample1 = 1, count1 = 1; sample2 = 2, count2 = 1 (前两个元素),然后处理第3个元素1
2. sample1 = 1, count1 = 2; sample2 = 2, count2 = 1,处理第4个元素2
3. sample1 = 1, count1 = 2; sample2 = 2, count2 = 2,处理第5个元素1
4. sample1 = 1, count1 = 3; sample2 = 2, count2 = 2,处理第6个元素3
5. sample1 = 1,
count1 = 3; sample2 = 2, count2 = 1(消去一个),处理第7个元素3
6. sample1
= 1, count1 = 3; sample2 = 2, count2 = 0(再消去一个),遍历完毕
这样一来, 我们就得到了两个元素1和2,那么谁是主元素呢?
有一种想法觉得count值大的是,其实不一定了,假如主元素和另外一个元素在某时刻count值相等,(我们对相等的处理是随机选择一个消去)那么主元素一旦被消去,就很可能一直处于“劣势”,一直被消去,虽然到最后不可能被替换,但count值会比另外一个小。所以,比较朴素的办法是就保存的这两个数再对数组进行一次遍历,看看谁多,主元素就是谁。(我不知道有没有更好的,可以一次遍历出结果的方法)。
代码如下:
class Solution: """ @param nums: A list of integers @return: The majority number occurs more than 1/3 """ def majorityNumber(self, nums): sample1, sample2 = nums[0], nums[1] count1, count2 = 0, 0 cur, n = 0, len(nums) while cur != n: if nums[cur] == sample1: count1 += 1 elif nums[cur] == sample2: count2 += 1 else: if count1 >= count2: count1 -= 1 else: count2 -= 1 if count1 < 0: sample1 = nums[cur] if count2 < 0: sample2 = nums[cur] cur += 1 cur = 0 count1, count2 = 0, 0 while cur != n: if nums[cur] == sample1: count1 += 1 elif nums[cur] == sample2: count2 += 1 cur += 1 return sample1 if count1 > count2 else sample2 # write your code here
标签:
原文地址:http://blog.csdn.net/guoziqing506/article/details/51483338