点击获取AI摘要

1550. 存在连续三个奇数的数组 E

给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false

示例 1:

输入:arr = [2,6,4,1]
输出:false
解释:不存在连续三个元素都是奇数的情况。

示例 2:

输入:arr = [1,2,34,3,4,5,7,23,12]
输出:true
解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。

提示:

  • 1 <= arr.length <= 1000
  • 1 <= arr[i] <= 1000

问题分析

嗯,不用分析了

算法思路

暴力搜索

  • 直接枚举所有长度为 3 的子数组,检查其中 3 个数是否全为奇数。
  • 时间复杂度:O(n)O(n),因为只需一次遍历;空间复杂度:O(1)O(1)

或:滑动窗口

  • 维护一个大小为 3 的窗口,窗口内统计奇数个数。
  • 窗口向右滑动时,更新进出元素的奇偶状态即可。
  • 时间复杂度:O(n)O(n),空间复杂度:O(1)O(1)

时间复杂度

时间复杂度O(n)O(n),遍历一次数组。

空间复杂度O(1)O(1),只使用固定数量的额外变量。

代码分解

  1. 初始化一个计数器 count = 0

  2. 遍历数组中的每个元素 x

    • 如果 x 是奇数,令 count += 1;否则重置 count = 0
    • 每次更新后,检查 count >= 3,若成立则返回 True
  3. 遍历结束后若未找到,返回 False

代码实现

滑动窗口

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def threeConsecutiveOdds(self, arr: list[int]) -> bool:
count = 0
for x in arr:
if x % 2 == 1:
count += 1
if count >= 3:
return True
else:
count = 0
return False

暴力枚举

1
2
3
4
5
6
7
8
9
10
class Solution:
def threeConsecutiveOdds(self, arr: list[int]) -> bool:
n = len(arr)
# 仅当数组长度至少为 3 时才有意义
for i in range(n - 2):
# 检查 arr[i], arr[i+1], arr[i+2] 是否全为奇数
if arr[i] % 2 == 1 and arr[i+1] % 2 == 1 and arr[i+2] % 2 == 1:
return True
return False