数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入数组:{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