算法-11未排序数组中累加和为给定值的最长子数组系列问题补2
描述
给定一个无序数组arr,其中元素只能是1或0。求arr所有的子数组中0和1个数相等的最长子数组的长度
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(n)O(n)
输入描述:
第一行一个整数N,表示数组长度
接下来一行有N个数表示数组中的数
接下来一行有N个数表示数组中的数
输出描述:
输出一个整数表示答案
示例1
输入: 5 1 0 1 0 1 输出: 4
思路
定义一个平衡因子key,遇到一个1就自增,遇到一个0就自减。遍历数组更新这个平衡因子,用一个哈希表记录0~i位置的平衡因子,我们可以知道对于一段数组arr[0:j],如果它的平衡因子为balance,且存在某个前面的位置i<j,满足arr[0:i]的平衡因子也是balance,这就说明子数组arr[i+1:j]的0和1数量相等,平衡因子归零,可以更新一次长度。
import java.util.Scanner; import java.util.HashMap; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = scanner.nextInt(); } HashMap<Integer,Integer> map = new HashMap<>(); map.put(0,-1); int key=0,maxLen=0; for(int i=0;i<n;i++){ key += arr[i]==0?-1:1; if(map.containsKey(key)){ maxLen = Math.max(maxLen,i-map.get(key)); }else { map.put(key,i); } } System.out.println(maxLen); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix