Description:
Given a binary array, find the maximum number of consecutive 1s in this array.
Example 1:
Input: [1,1,0,1,1,1]
Output: 3
Explanation: The first two digits or the last three digits are consecutive 1s.
The maximum number of consecutive 1s is 3.
Note:
- The input array will only contain 0 and 1.
- The length of input array is a positive integer and will not exceed 10,000
Analysis:
Scheme1: Dynamic Programming
Define an array dp
, the length of which is nums.length+1
, and dp[i]
represents the current max number of 1s after scanning the first i
elements.
Here we also define a variable curNumber
which maintains the current number of consecutive 1s.
d
p
[
i
]
=
{
m
a
x
{
d
p
[
i
−
1
]
,
c
u
r
N
u
m
b
e
r
}
,
(
n
u
m
s
[
i
]
=
=
1
,
c
u
r
N
u
m
b
e
r
+
+
)
;
d
p
[
i
−
1
]
,
(
n
u
m
s
[
i
]
=
=
0
,
c
u
r
N
u
m
b
e
r
=
0
)
dp[i] = \begin{cases} max\{dp[i-1], curNumber\}, (nums[i] == 1, curNumber++); \\ dp[i-1], (nums[i] == 0, curNumber = 0) \end{cases}
dp[i]={max{dp[i−1],curNumber},(nums[i]==1,curNumber++);dp[i−1],(nums[i]==0,curNumber=0)
Shheme2: Sliding window
Use an unfixed-size sliding window to solve this problem, pretty trivial.
Code:
Dynamic Programming:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int N = nums.length;
int[] dp = new int[N+1];
dp[0] = 0;
int curNumber = 0;
for(int i = 1; i < N+1; i++) {
if(nums[i-1] == 1) {
curNumber++;
dp[i] = Math.max(dp[i-1], curNumber);
}else {
curNumber = 0;
dp[i] = dp[i-1];
}
}
return dp[N];
}
}
Sliding Window:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int maximum = 0;
for(int i = 0, j = 0; i < nums.length && j < nums.length;) {
if(nums[j] == 1) {
maximum = Math.max(maximum, (j-i+1));
j++;
}else{
j++;
i = j;
}
}
return maximum;
}
}