题解 | #未排序数组中累加和为给定值的最长子数组长度#
未排序数组中累加和为给定值的最长子数组长度
https://www.nowcoder.com/practice/36fb0fd3c656480c92b569258a1223d5
抄的,自己写的前缀和+hash没有处理好0值并且写的很臭,下面的代码相对美观
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static int maxLength(int[] arr, int k) { if (arr == null || arr.length == 0) { return 0; } //map中的key用来记录累加和,对应的value是这个累加和第一次出现的下标 HashMap<Integer, Integer> map = new HashMap<>(); //这个很关键的,当数组从0开始的累加和是k时就会用到,所以一定要保证<0,-1>已经在map中了,这个当前i个和等于k时就用到了 //当{1,2,3} k = 3时就可以体现出来,好好体会! map.put(0, -1); //sum用来记录数组前i项的和,length用来记录最后的答案 int sum = 0, length = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; //看看map中是否已经存过sum-k这个累加和了,有的话从那个值到目前的i就是length了 if (map.containsKey(sum - k)) { int j = map.get(sum - k); length = i - j > length ? i - j : length; } if (!map.containsKey(sum)) { map.put(sum, i); } } return length; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n]; int k =scanner.nextInt(); for (int i = 0; i < arr.length; i++) { arr[i] = scanner.nextInt(); } int ans = maxLength(arr,k); System.out.println(ans); } }
栈和队列,记录栈和队列的一些题 文章被收录于专栏
栈和队列,记录栈和队列的一些题