📌  相关文章
📜  1s 计数比 0s 多 1 的最长子数组(1)

📅  最后修改于: 2023-12-03 15:13:06.276000             🧑  作者: Mango

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):

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]