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 <= 1000
  • 1 <= 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)只使用常数额外空间