码迷,mamicode.com
首页 > 其他好文 > 详细

主元素 II

时间:2016-05-27 13:06:53      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

样例:给出数组[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


主元素 II

标签:

原文地址:http://blog.csdn.net/guoziqing506/article/details/51483338

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!