day20笔记
1.题目描述
2.代码构思(debug)
方法1:哈希表
思路
我们知道出现次数最多的元素大于 floor的n/2次,所以可以用哈希表来快速统计每个元素出现的次数。
方法2:
方法二:排序
思路
如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为n/2的元素的元素(下标从 0 开始)一定是众数。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort()
return nums[len(nums) // 2]
方法3:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
多数元素ii也可通过hash表基数解决
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
ans = []
element1, element2 = 0, 0
vote1, vote2 = 0, 0
for num in nums:
# 如果该元素为第一个元素,则计数加1
if vote1 > 0 and num == element1:
vote1 += 1
# 如果该元素为第二个元素,则计数加1
elif vote2 > 0 and num == element2:
vote2 += 1
# 选择第一个元素
elif vote1 == 0:
element1 = num
vote1 += 1
# 选择第二个元素
elif vote2 == 0:
element2 = num
vote2 += 1
# 如果三个元素均不相同,则相互抵消1次
else:
vote1 -= 1
vote2 -= 1
cnt1, cnt2 = 0, 0
for num in nums:
if vote1 > 0 and num == element1:
cnt1 += 1
if vote2 > 0 and num == element2:
cnt2 += 1
# 检测元素出现的次数是否满足要求
if vote1 > 0 and cnt1 > len(nums) / 3:
ans.append(element1)
if vote2 > 0 and cnt2 > len(nums) / 3:
ans.append(element2)
return ans