给定一个无序数组arr,其中元素可正、可负、可0。求arr所有子数组中正数与负数个数相等的最长子数组的长度。
[要求]
时间复杂度为
,空间复杂度为
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.HashMap; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); String[] strArr = br.readLine().split(" "); int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = Integer.parseInt(strArr[i]); } int balance = 0, maxLen = 0; HashMap<Integer, Integer> map = new HashMap<>(); map.put(0, -1); for(int i = 0; i < n; i++){ if(arr[i] == 0) continue; balance += arr[i] > 0? 1: -1; if(map.containsKey(balance)){ maxLen = Math.max(maxLen, i - map.get(balance)); }else{ map.put(balance, i); } } System.out.println(maxLen); } }
import java.io.*; import java.util.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] str = in.readLine().split(" "); int n = Integer.parseInt(str[0]); int[] arr = new int[n]; int j = 0; for(String i:in.readLine().split(" ")){ arr[j++] = Integer.parseInt(i); } System.out.println(getLength(arr)); } static int getLength(int[] arr){ int len = 0; int sum = 0; HashMap<Integer,Integer> map = new HashMap<>(); map.put(0,-1); for(int i=0;i<arr.length;i++){ if(arr[i]>0) arr[i] = 1; if(arr[i]<0) arr[i] = -1; } for(int i=0;i<arr.length;i++){ sum += arr[i]; if(!map.containsKey(sum)) map.put(sum,i); if(map.containsKey(sum)) len = Math.max(i - map.get(sum),len); } return len; } }
import java.util.*; 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(); } Map<Integer,Integer> map = new HashMap<>(); //key为 正数个数-负数个数 map.put(0,-1); int key = 0,maxLen = 0; for(int i=0;i<n;i++){ key += arr[i]==0?0:arr[i]/Math.abs(arr[i]); if(map.containsKey(key)){ maxLen = Math.max(maxLen,i-map.get(key)); }else{ map.put(key,i); } } System.out.print(maxLen); } }