平均数为k的最长连续子数组(美团2024届秋招笔试第三场编程真题)

题面

核心思想

如果一段区间内的数平均值为k,那么每个数减去k之后平均值就为0

所以每个数-k

然后计算前缀和并放入map

其中:key=前缀和 value=当前下标

出现重复的前缀和preSum 说明存在平均值为k的区间 [mp.get[preSum] + 1, i]

由于需要最长的子数组 所以只记录最先存在的下标

代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        int b = in.nextInt();
        HashMap<Long,Integer> mp = new HashMap<>();
        mp.put(0L, 0);
        Long pre = 0L, cur = 0L;
        int res = -1;
        for(int i = 1; i <= a; i++){
            cur = pre + in.nextInt() - b;
            if(mp.containsKey(cur)){
                res = Math.max(res, i - mp.get(cur));
            }
            else mp.put(cur, i);
            pre = cur;
        }
        System.out.println(res);
    }

}
posted @ 2024-04-01 17:19  Shie1d  阅读(78)  评论(0)    收藏  举报