题解 | #未排序数组中累加和为给定值的最长子数组长度#

未排序数组中累加和为给定值的最长子数组长度

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);
    }
}

栈和队列,记录栈和队列的一些题

全部评论

相关推荐

10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务