1346.检查整数及其两倍数是否存在
# 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
# 更正式地,检查是否存在两个下标 i 和 j 满足:
# i != j
# 0 <= i, j < arr.length
# arr[i] == 2 * arr[j]
class Solution(object):
def checkIfExist(self, arr):
"""
:type arr: List[int]
:rtype: bool
"""
s=0
for item in arr:
#处理只有一个0不满足要求的情况
if item==0:
s+=1
if s>=2:
return True
elif item*2 in arr:
return True
return False
问题分析与优化建议
1. 潜在问题
- 重复查找问题:在
elif item*2 in arr:
这一行中,in
操作的时间复杂度为 O(n),导致整体时间复杂度为 O(n^2)。对于较大的输入数组,性能会显著下降。 - 边界条件未充分考虑:虽然代码逻辑基本正确,但如果数组为空 (
arr = []
),代码会直接返回False
,这符合题意,但需要明确说明。 - 变量命名不够清晰:变量
s
的命名不够直观,可能会让代码的可读性降低。
2. 优化方向
- 使用哈希集合优化查找:通过维护一个哈希集合(
set
),可以将查找操作的时间复杂度从 O(n) 降低到 O(1),从而将整体时间复杂度优化为 O(n)。 - 改进变量命名:将变量
s
改为更具语义化的名称,例如zero_count
,以提高代码的可读性。 - 提前退出优化:如果数组为空,可以直接返回
False
,避免不必要的循环。
class Solution(object):
def checkIfExist(self, arr):
"""
:type arr: List[int]
:rtype: bool
"""
if not arr: # 如果数组为空,直接返回 False
return False
seen = set() # 使用哈希集合存储已经遍历过的元素
zero_count = 0 # 记录零的数量
for item in arr:
if item == 0:
zero_count += 1
if zero_count >= 2: # 如果有至少两个零,返回 True
return True
else:
if item * 2 in seen or (item % 2 == 0 and item // 2 in seen): # 检查是否存在两倍或一半的值
return True
seen.add(item) # 将当前元素加入集合
return False
605.种花问题
# 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,
# 它们会争夺水源,两者都会死去。
# 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,
# 1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
class Solution(object):
def canPlaceFlowers(self, flowerbed, n):
"""
判断能否在花床中种入n朵花,而不违反花之间必须有空地的规则。
:type flowerbed: List[int] 花床的表示,0表示空地,1表示已种花。
:type n: int 需要种入的花的数量。
:rtype: bool 表示是否能种入n朵花。
"""
# 如果需要种的花的数量小于等于0,直接返回True
if n <= 0:
return True
# 将花床列表转换为字符串,便于后续处理
f_s = ''.join(map(str, flowerbed))
# 以1为分隔符,将字符串分割为多个空地段
f_lst = f_s.split('1')
# 初始化可以种的花的数量
N = 0
# 如果只有一个空地段
if len(f_lst) == 1:
# 如果空地长度为偶数,可以种的花的数量是长度的一半
if len(f_lst[0]) % 2 == 0:
N = len(f_lst[0]) // 2
else:
# 如果空地长度为奇数,可以种的花的数量是(长度+1)的一半
N = (len(f_lst[0]) + 1) // 2
# 返回是否可以种入n朵花
return N >= n
# 对于多个空地段,计算每个空地段可以种的花的数量
for i in range(len(f_lst)):
# 对于开头和结尾的空地段
if i == 0 or i == len(f_lst) - 1:
# 如果空地段长度为0,则不进行计算
if len(f_lst[i]) ==0:
N=N
else:
# 对于开头和结尾的空地,可以种植的花的数量是 length // 2
N += (len(f_lst[i]) ) // 2
else:
# 对于中间的空地段
if len(f_lst[i]) ==0:
N=N
else:
# 对于中间的空地,可以种植的花的数量是 (length - 1) // 2
N += (len(f_lst[i]) - 1) // 2
# 返回是否可以种入n朵花
return N >= n