LeetCode 1550: Three Consecutive Odds (Run-Length Count of Odd Numbers)
LeetCode 1550ArrayParityToday we solve LeetCode 1550 - Three Consecutive Odds.
Source: https://leetcode.com/problems/three-consecutive-odds/
English
Problem Summary
Given an integer array arr, return true if there exist three consecutive odd numbers in the array; otherwise return false.
Key Insight
We only care about the current consecutive odd streak length. Odd extends the streak; even breaks it. The moment streak reaches 3, we can return immediately.
Algorithm
- Initialize oddStreak = 0.
- Traverse each number x in arr.
- If x is odd, increment oddStreak; else reset to 0.
- If oddStreak == 3, return true.
- Finish traversal without hit: return false.
Complexity Analysis
Let n be the array length.
Time: O(n).
Space: O(1).
Common Pitfalls
- Forgetting to reset streak when encountering an even value.
- Continuing scan after streak reaches 3 (unnecessary work).
- Overcomplicating with sliding windows when a single counter is enough.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean threeConsecutiveOdds(int[] arr) {
int oddStreak = 0;
for (int x : arr) {
if ((x & 1) == 1) {
oddStreak++;
if (oddStreak == 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
}
}func threeConsecutiveOdds(arr []int) bool {
oddStreak := 0
for _, x := range arr {
if x%2 != 0 {
oddStreak++
if oddStreak == 3 {
return true
}
} else {
oddStreak = 0
}
}
return false
}class Solution {
public:
bool threeConsecutiveOdds(vector<int>& arr) {
int oddStreak = 0;
for (int x : arr) {
if (x % 2 != 0) {
oddStreak++;
if (oddStreak == 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
}
};class Solution:
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
odd_streak = 0
for x in arr:
if x % 2 == 1:
odd_streak += 1
if odd_streak == 3:
return True
else:
odd_streak = 0
return Falsevar threeConsecutiveOdds = function(arr) {
let oddStreak = 0;
for (const x of arr) {
if ((x & 1) === 1) {
oddStreak++;
if (oddStreak === 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
};中文
题目概述
给定整数数组 arr,如果数组中存在三个连续奇数,返回 true;否则返回 false。
核心思路
只维护“当前连续奇数个数”。遇到奇数就加一,遇到偶数就清零;一旦计数到 3,就可以立即返回 true。
算法步骤
- 初始化 oddStreak = 0。
- 遍历数组每个元素 x。
- 若 x 为奇数,oddStreak++;否则重置为 0。
- 若 oddStreak == 3,立即返回 true。
- 遍历结束仍未命中,返回 false。
复杂度分析
设数组长度为 n。
时间复杂度:O(n)。
空间复杂度:O(1)。
常见陷阱
- 遇到偶数后忘记把连续计数清零。
- 已经达到 3 还继续扫描,造成不必要的开销。
- 把问题做复杂,使用窗口/前缀结构,其实一个计数器就够。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean threeConsecutiveOdds(int[] arr) {
int oddStreak = 0;
for (int x : arr) {
if ((x & 1) == 1) {
oddStreak++;
if (oddStreak == 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
}
}func threeConsecutiveOdds(arr []int) bool {
oddStreak := 0
for _, x := range arr {
if x%2 != 0 {
oddStreak++
if oddStreak == 3 {
return true
}
} else {
oddStreak = 0
}
}
return false
}class Solution {
public:
bool threeConsecutiveOdds(vector<int>& arr) {
int oddStreak = 0;
for (int x : arr) {
if (x % 2 != 0) {
oddStreak++;
if (oddStreak == 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
}
};class Solution:
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
odd_streak = 0
for x in arr:
if x % 2 == 1:
odd_streak += 1
if odd_streak == 3:
return True
else:
odd_streak = 0
return Falsevar threeConsecutiveOdds = function(arr) {
let oddStreak = 0;
for (const x of arr) {
if ((x & 1) === 1) {
oddStreak++;
if (oddStreak === 3) {
return true;
}
} else {
oddStreak = 0;
}
}
return false;
};
Comments