数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入数组:{1,3,3,2,3,2,3,3,2}。由于2在数组中出现了5次,超过数组长度的一半,因此要输出2。

 

思路:哈希表统计。遍历整个数组,如果当前数字在字典中不存在,就把他放入字典中;如果在字典中存在,就把他数量加1,并判断他的数量是否大于数组长度的一半,是的话返回当前数字,不是继续遍历。

class solution:
    def majorityelement(self,nums):
        if not nums:
            return None
        if len(nums)==1:
            return nums[0]
        write = {}
        for i in nums:
            if i not in write:
                write[i] = 1
            else:
                write[i] += 1
                if write[i] > (len(nums)/2):
                    return i
        return None

 

抵消法:数组中有一个数字出现次数超过一半,说明他出现的次数比其他剩余数字出现的次数总和还要多。在遍历数组时保存两个值result和times,result保存数字,times保存次数。遍历下一个数字与之前保存的数字相同,times+1,不同就times-1,如果times==0,重新记录下一个数字

class solution:
    def majorityelement(self,nums):
        if not nums:
            return None
        result = nums[0]
        times = 1
        for i in nums[1:]:
            if times == 0:
                result = i
                times = 1
            elif i == result:
                times += 1
            else:
                times -= 1
        return result

 

posted @ 2020-08-19 09:13  ninian  阅读(119)  评论(0)    收藏  举报