剑指 Offer II 011. 0 和 1 个数相同的子数组
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
示例 1:
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
示例 2:
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
这样写代码,时间复杂度超过了,好像有个前缀和加哈希表时间开销少一点:
int findMaxLength(int* nums, int numsSize){
int dp[numsSize][2];
for(int i=0;i<numsSize;i++){
if(i==0){
if(nums[i]==0){
dp[0][0]=1;
dp[0][1]=0;
}
else{
dp[0][0]=0;
dp[0][1]=1;
}
continue;
}
if(nums[i]==0){
dp[i][0]= dp[i-1][0]+1;
dp[i][1]=dp[i-1][1];
}
else{
dp[i][0]= dp[i-1][0];
dp[i][1]=dp[i-1][1]+1;
}
}
int max=0;
for(int i=numsSize-1;i>=0;i--){
if(dp[i][0]==dp[i][1]){
if(dp[i][0]>max){
max=dp[i][0];
}
break;
}
for(int j=0;j<i;j++){
if(dp[i][0]-dp[j][0]==dp[i][1]-dp[j][1]){
if(dp[i][0]-dp[j][0]>max){
max=dp[i][0]-dp[j][0];
}
break;
}
}
}
return max*2;
}