「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
数组:
[只出现一次的数字]
题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1 示例 2:
输入: [4,1,2,1,2] 输出: 4
先实现第一想法: 遍历,然后count(),这种简单粗暴,比较简单
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 先判断是否是一位,如果是直接返回,属于特殊情况
if len(nums) ==1:
return nums[0]
for row in nums:
if nums.count(row) == 1:
return row
执行结果:
上述方法比较简单,但是显然不符合题目要求
分析题中说明部分,具有线性时间复杂度 & 不使用额外空间
显然上面算法不符合两个条件,我们来看一种符合条件的算法
符合不使用额外空间的算法,就想到了位运算,时间复杂度又符合线性复杂度:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
total = len(nums)
for row in range(1, total):
nums[0] ^= nums[row]
return nums[0]
执行结果:
题2:
[多数元素]
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3] 输出:3 示例 2:
输入:[2,2,1,1,1,2,2] 输出:2 进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
解题思路:
- 遍历数组
- 使用字典进行存储,然后对字典中存储的数据进行比对,获取最大数据所对应的key值就是我们要找的数据
实现代码
class Solution:
def majorityElement(self, nums: List[int]) -> int:
res = {}
result = nums[0]
for row in nums:
res.setdefault(row,0)
if row in res.keys():
res[row]+=1
if res[row] >res[result]:
result = row
return result
执行结果:(虽然成功,但不是最优解)