1. 问题描述:
给你一个整数数组 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
2. 思路分析:
一个比较容易想到的是暴力破解,依次检查当前位置以及之后的两个元素是否满足条件假如满足都是连续的三个奇数那么返回True,第二个是在领扣的题解中找到的比较奇妙的双指针解法,使用两个变量分别记录连续奇数的位置,假如当前位置是偶数的话那么计算连续奇数的个数,若满足三个那么返回True,不满足则返回更新连续奇数的起始位置,最后需要注意计算一下连续奇数的个数因为有可能全部都是奇数所以这个时候也是返回True的
3. 代码如下:
领扣官方比较简洁的暴力解法:
class Solution:
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
n = len(arr)
return n >= 3 and \
any(arr[i] & 1 and arr[i + 1] & 1 and arr[i + 2] & 1 \
for i in range(n - 2))
from typing import List
class Solution:
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
i, count = 0, 0
while i < len(arr):
while i < len(arr) and arr[i] % 2 != 0:
count += 1
i += 1
if count >= 3: return True
else: count = 0
i += 1
return False
双指针解法:
from typing import List
class Solution:
# 这个是从领扣上拷贝下来的双指针的做法感觉思路还是很ok的
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
i, j, length = 0, 0, len(arr)
while j < length:
if arr[j] % 2 == 0:
if j - 1 - i >= 2: return True
i = j + 1
j += 1
if j - 1 - i >= 2: return True
return False