Skip to content

Latest commit

 

History

History
123 lines (92 loc) · 2.61 KB

File metadata and controls

123 lines (92 loc) · 2.61 KB

题目描述

给定一个二进制数组 nums , 找到含有相同数量的 01 的最长连续子数组,并返回该子数组的长度。

 

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。

 

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1

 

注意:本题与主站 525 题相同: https://leetcode-cn.com/problems/contiguous-array/

解法

前缀和加哈希表,把 0 当作 -1 处理,题目变成求和为 0 的子数组

Python3

class Solution:
    def findMaxLength(self, nums: List[int]) -> int:
        m = {0: -1}
        ans, sum = 0, 0
        for i, num in enumerate(nums):
            sum += 1 if num == 1 else -1
            if sum in m:
                ans = max(ans, i - m[sum])
            else:
                m[sum] = i
        return ans

Java

class Solution {
    public int findMaxLength(int[] nums) {
        Map<Integer, Integer> m = new HashMap<>();
        m.put(0, -1);
        int ans = 0, sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i] == 1 ? 1 : -1;
            if (m.containsKey(sum)) {
                ans = Math.max(ans, i - m.get(sum));
            } else {
                m.put(sum, i);
            }
        }
        return ans;
    }
}

Go

func findMaxLength(nums []int) int {
	m := map[int]int{0: -1}
	ans, sum := 0, 0
	for i, num := range nums {
		if num == 0 {
			sum -= 1
		} else {
			sum += 1
		}
		if j, ok := m[sum]; ok {
			ans = max(ans, i-j)
		} else {
			m[sum] = i
		}
	}
	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

...