给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
需要寻找数组内的多数元素只需遍历数组后输出出现次数大于[n/2]的元素即可,但如果要遍历整个数组并且记录每个数出现的次数那么算法的时间复杂度将会达到O(n**2)甚至更高,这并不是一个最佳的解决方案。所以为了降低算法的时间复杂度我们可以采用下述算法。
算法逻辑
首先将arr中的第一个元素插入到tmp中进行初始化,随后从arr[1]开始遍历数组,若tmp中最后一个元素与arr[i]相等,则将arr[i]插入到tmp中,反之不一样则将tmp中的最后一个元素踢出tmp数组内
当tmp空时将arr[i]插入进来重复上述步骤,最后tmp内至少会有一个元素为出现次数最多的元素
代码实现
arr = 我们所输入的数组
tmp = 最后输出所用到的数组,初始为空
count = tmp数组的索引,初始为0且最小为0
第一步
做初始化,tmp数组默认为空,所以先将arr[0]插入到数组tmp中
arr = [2,2,1,1,1,2,2]
tmp = []
tmp.append(arr[0])
count = 0
第二步
遍历数组,从i = 1开始遍历,将tmp[count]与arr[i]做比较,
若相等,则将arr[i] 与 tmp[count]相等,则将arr[i]插入到tmp数组内,count索引向前进一位
若不相等,则将tmp[count]移除tmp数组内,count索引向后移动一位
当count == 0时count索引无法向后移动,可以选择把arr[i]赋予给tmp[count]
重复上述步骤最后输出tmp[0]即可
for i in range(1,len(arr)):
if tmp[count] == arr[i]:
tmp.append(arr[i])
count += 1
if tmp[count] != arr[i]:
if count == 0:
tmp[count] = arr[i]
if count > 0:
tmp.pop(count)
count -= 1
完整代码
arr = [2,2,1,1,1,2,2]
tmp = []
tmp.append(arr[0])
count = 0
for i in range(1,len(arr)):
if tmp[count] == arr[i]:
tmp.append(arr[i])
count += 1
if tmp[count] != arr[i]:
if count == 0:
tmp[count] = arr[i]
if count > 0:
tmp.pop(count)
count -= 1
print(tmp[0])