LeetCode刷题笔记第169题:多数元素
要找到数组中超过数组一半长度的元素
想法一:
遍历整个数组用字典来存储每个数字出现的次数,找到出现次数超过数组一半长度的元素。
时间复杂度为:O(n)
空间复杂度为:O(n)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
if len(nums) == 1: # 当数组长度为1时无需判断,直接返回该元素
return nums[0]
else:
nums_dict = {} # 建立一个空字典
for i in nums: # 遍历整个数组,记录数组中各个元素出现的次数
if i in nums_dict:
nums_dict[i] += 1
else:
nums_dict[i] = 1
for k, v in nums_dict.items(): # 找到超过数组长度一半的元素
if v >= len(nums)/2:
return k
想法二:
数组中存在超过数组长度一半的元素,则将数组从小到大或从大到小的排序后,最中间的元素则为超过数组长度一半的元素。
时间复杂度:O(nlogn)。将数组排序的时间复杂度为 O(nlogn)。
空间复杂度:O(logn)。如果使用语言自带的排序算法,需要使用 O(logn)的栈空间。如果自己编写堆排序,则只需要使用 O(1)的额外空间。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort()
return nums[len(nums) // 2]
想法三:
因为超过数组一半长度的元素个数大于所有其他元素的数量,遍历整个数组从数组开始记录,若后一个元素与当前记录的元素相同则记录加一,否则减一,当记录为0时转换记录的数组元素,最终记录的数组元素为超过数组长度一半的元素。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 摩尔投票法
# 设置major表示多数数值
major = 0
# 设置count计数
count = 0
# 通过循环获取数组中元素数值
for n in nums:
# 当计数值为0时,将当前数值赋给major
if count == 0:
major = n
# 如果当前数值与major相等则计数加一
if n == major:
count += 1
# 否则计数减一
else:
count -= 1
# 返回major的数值
return major