程序员代码面试指南刷题--第八章.未排序数组中累加和为给定值的最长子数组的长度

题目描述
给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度
输入描述:

第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出
第二行N个整数表示数组内的数

输出描述:

输出一个整数表示答案

示例1

输入

5 0
1 -2 1 1 1

输出

3

解法一:利用map前减后

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s1 = br.readLine().trim().split(" ");
        String[] s2 = br.readLine().trim().split(" ");
        int len = Integer.parseInt(s1[0]);
        int sum = Integer.parseInt(s1[1]);
        int[] arr = new int[len];
        for(int i=0;i<len;i++){
            arr[i] = Integer.parseInt(s2[i]);
        }
        int res = func(arr,sum);
        System.out.println(res);
    }
    public static int func(int[] arr,int k){
        if(arr==null||arr.length==0) return 0;
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,-1);
        int sum = 0;
        int res = 0;
        for(int i=0;i<arr.length;i++){
            sum += arr[i];
            int tmp = sum-k;
            if(map.containsKey(tmp)){
                res = Math.max(i-map.get(tmp),res);
            }
            if(!map.containsKey(sum)){
                map.put(sum,i);
            }
        }
        return res;
    }
}
发布了189 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44406146/article/details/105465424