leetcode 525 连续数组

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

示例 1:

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

示例 2:

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

import java.util.HashMap;
import java.util.Map;

/**
 * @Class FindMaxLength
 * @Description 525 连续数组
 * @Author
 * @Date 2021/6/3
 **/
public class FindMaxLength {

    /**
     * 前缀和+ 哈希
     *
     * @param nums
     * @return
     */
    public static int findMaxLength(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        int sum = 0;
        int n = nums.length;
        // 最大长度
        int maxLength = 0;
        // 保存到i位置的数组和以及对应的位置
        Map<Integer, Integer> integerMap = new HashMap<>();
        // 初值,目的是为了得到从下标0开始的连续数组长度
        integerMap.put(0, -1);

        for (int i = 0; i < n; i++) {
            //把所有num[i]为0当成-1,这样子这个最长连续子数组总和就是0
            sum += nums[i] == 1 ? 1 : -1;
            // Map 中以及包含了key值为sum的元素,说明从其对应的value位置开始到i位置之间是符合要求的连续数组
            if (integerMap.containsKey(sum)) {
                maxLength = Math.max(i - integerMap.get(sum), maxLength);
            } else {
                integerMap.put(sum, i);
            }
        }
        return maxLength;
    }

}
// 测试用例
public static void main(String[] args) {
	int[] nums = new int[]{0, 1};
	int ans = FindMaxLength.findMaxLength(nums);
	System.out.println("FindMaxLength demo01 result : " + ans);

	nums = new int[]{0, 1, 0};
	ans = FindMaxLength.findMaxLength(nums);
	System.out.println("FindMaxLength demo02 result : " + ans);
}
原文地址:https://www.cnblogs.com/fyusac/p/14846676.html