问题来自这里https://leetcode.com/problems/contiguous-array/
实际上,我针对此问题提出了DP解决方案。 但是,它不会通过一个测试用例。
有什么想法吗?
DP [i] [j] == 1表示从子字符串[i]到子字符串[j]有效
将问题分成较小的
DP [i] [j] == 1
- if DP[i+2][j]==1 and DP[i][i+1]==1
- else if DP[i][j-2]==1 and DP[j-1][j]==1
- else if num[i],num[j] == set([0,1]) and DP[i+1][j-1]==1
``` current_max_len = 0 如果不是数字: 返回current_max_len
dp = [] * len(nums)
for _ in range(len(nums)):
dp.append([None] * len(nums))
for thisLen in range(2, len(nums)+1, 2):
for i in range(len(nums)):
last_index = i + thisLen -1
if i + thisLen > len(nums):
continue
if thisLen==2:
if set(nums[i:i+2]) == set([0, 1]):
dp[i][last_index] = 1
elif dp[i][last_index-2] and dp[last_index-1][last_index]:
dp[i][last_index] = 1
elif dp[i][i + 1] and dp[i + 2][last_index]:
dp[i][last_index] = 1
elif dp[i + 1][last_index-1] and set([nums[i], nums[last_index]]) == set([0, 1]):
dp[i][last_index] = 1
else:
dp[i][last_index] = 0
if dp[i][last_index] == 1:
current_max_len = max(current_max_len, thisLen)
return current_max_len
```
答案 0 :(得分:1)
这是一个反例[1, 1, 0, 0, 0, 0, 1, 1]
。您的解决方案存在的问题是,它需要一个列表由大小为n-1或n-2的较小有效列表组成,在此反例中,它是两个长度为4
或n-2
的列表。 -SPOILER ALERT-您可以通过基本上对每个i,j使用其他dp技术来解决该问题,您可以在恒定时间内找到它们之间的一和零的数量,而只需从开始就存储一的数量即可。列出每个索引i
答案 1 :(得分:0)
这是python代码
def func( nums):
track,has=0,{0:-1}
length=len(nums);
ress_max=0;
for i in range(0,length):
track += (1 if nums[i]==1 else -1)
if track not in has:
has[track]=i
elif ress_max <i-has[track]:
ress_max = i-has[track]
return ress_max
l = list(map(int,input().strip().split()))
print(func(l))
答案 2 :(得分:0)
由于给定的二进制字符串长度最多为50000
。因此,运行O(n * n)
算法可能会导致time limit exceed
。我建议您解决O(n)
的时间和空间复杂性问题。这个想法是:
0
视为-1
的数字求和,则总和应始终为zero
。L
到R
范围内的零求和,如果前缀求和为L - 1
,前缀求和为{{1} }相等。R
中,并将其值作为当前索引,并且对于该特定总和将永久存在。hash map
已经在映射中,并与值0
配对作为索引。 -1
中的示例代码如下:
C++