Easy
题目描述
给你一个整数数组 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 <= 10001 <= arr[i] <= 1000
解题思路
解题思路
这道题要求判断数组中是否存在连续的三个奇数,思路比较直观。
方法一:三重循环检查(不推荐) 最朴素的做法是检查每个可能的三元组,但这样时间复杂度较高。
方法二:单次遍历(推荐) 我们可以通过一次遍历来解决这个问题。从数组的第一个元素开始,检查每个连续的三个元素是否都是奇数。具体做法:
- 遍历数组,对于每个位置 i(i <= n-3),检查 arr[i]、arr[i+1]、arr[i+2] 是否都是奇数
- 如果找到连续三个奇数,立即返回 true
- 如果遍历完都没找到,返回 false
方法三:计数器优化 还可以用一个计数器记录当前连续奇数的个数,遇到偶数时重置计数器,当计数器达到3时返回true。
判断奇数的方法是检查 num % 2 == 1 或者 num & 1 == 1。
推荐使用方法二,代码简洁且易理解。
代码实现
class Solution {
public:
bool threeConsecutiveOdds(vector<int>& arr) {
int n = arr.size();
if (n < 3) return false;
for (int i = 0; i <= n - 3; i++) {
if (arr[i] % 2 == 1 && arr[i + 1] % 2 == 1 && arr[i + 2] % 2 == 1) {
return true;
}
}
return false;
}
};
class Solution:
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
n = len(arr)
if n < 3:
return False
for i in range(n - 2):
if arr[i] % 2 == 1 and arr[i + 1] % 2 == 1 and arr[i + 2] % 2 == 1:
return True
return False
public class Solution {
public bool ThreeConsecutiveOdds(int[] arr) {
int n = arr.Length;
if (n < 3) return false;
for (int i = 0; i <= n - 3; i++) {
if (arr[i] % 2 == 1 && arr[i + 1] % 2 == 1 && arr[i + 2] % 2 == 1) {
return true;
}
}
return false;
}
}
var threeConsecutiveOdds = function(arr) {
for (let i = 0; i <= arr.length - 3; i++) {
if (arr[i] % 2 === 1 && arr[i + 1] % 2 === 1 && arr[i + 2] % 2 === 1) {
return true;
}
}
return false;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 最坏情况下需要遍历整个数组 |
| 空间复杂度 | O(1) | 只使用常数额外空间 |