📅  最后修改于: 2023-12-03 15:13:06.276000             🧑  作者: Mango
给定一个由 0 与 1 组成的数组,找到其中最长的子数组,使得子数组中 1 的数量比 0 的数量多 1。
例如,输入数组为 [0, 1, 1, 0, 1, 0, 0],输出为 [1, 1, 0, 1],其中子数组 [1, 1, 0, 1] 中 1 的数量为 3,0 的数量为 2,符合条件。
代码如下(使用Python):
def longestSubarray(arr: List[int]) -> List[int]:
n = len(arr)
ans, l = 0, 0
cnt = [0] * (n + 1)
for i in range(n):
cnt[i + 1] = cnt[i] + 1 if arr[i] == 1 else cnt[i] - 1
min_val = min(cnt)
max_val = max(cnt)
for i in range(n):
if cnt[i] == min_val and cnt[i] != cnt[i+1]:
l = i + 1
if cnt[i] == max_val and cnt[i] != cnt[i+1]:
ans = max(ans, i - l + 1)
return arr[l:l+ans]
markdown解析如下:
## 1s 计数比 0s 多 1 的最长子数组
给定一个由 0 与 1 组成的数组,找到其中最长的子数组,使得子数组中 1 的数量比 0 的数量多 1。
例如,输入数组为 [0, 1, 1, 0, 1, 0, 0],输出为 [1, 1, 0, 1],其中子数组 [1, 1, 0, 1] 中 1 的数量为 3,0 的数量为 2,符合条件。
代码如下(使用Python):
```Python
def longestSubarray(arr: List[int]) -> List[int]:
n = len(arr)
ans, l = 0, 0
cnt = [0] * (n + 1)
for i in range(n):
cnt[i + 1] = cnt[i] + 1 if arr[i] == 1 else cnt[i] - 1
min_val = min(cnt)
max_val = max(cnt)
for i in range(n):
if cnt[i] == min_val and cnt[i] != cnt[i+1]:
l = i + 1
if cnt[i] == max_val and cnt[i] != cnt[i+1]:
ans = max(ans, i - l + 1)
return arr[l:l+ans]