KGlzwgs 2024-02-29 21:56 采纳率: 57.1%
浏览 5

java内存超限 static long S; static long[] sum=new =


import java.util.*;
public class Main{
    static int N;
    static long S;
    static long[] sum=new long[1000001];
    public static boolean check(int n){
        long tmp=0;
        for(int i=1;i+2*n-1<=N;i++){
            if((sum[i+n-1]-sum[i-1])>S || (sum[i+2*n-1]-sum[i+n-1])>S) continue;
            return true;
        }
        return false;
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        N=sc.nextInt();
        S=sc.nextLong();
        for(int i=1;i<=N;i++) {
            sum[i]=sum[i-1]+sc.nextInt();
        }
        int L=1,R=1000000;
        while(L<R){
            int middle=(L+R+1)/2;
            if(check(middle)) L=middle;
            else R=middle-1;
        }
        System.out.println(2*L);
    }
}

最近在做蓝桥杯内存超限了我不知道哪里超限求解答

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-02-29 21:57
    关注

    KGlzwgs 晚上好🌙🌙🌙
    本答案参考通义千问

    你的Java程序中存在一个静态数组sum,其大小为1000001,这可能会导致内存溢出(内存超限)问题,尤其是在处理大规模输入时。因为每次调用check方法时,都会创建一个新的sum数组副本,而check方法可能会被多次调用。

    解决这个问题的方法是避免在check方法中创建新的sum数组副本。你可以将sum数组从静态成员变量移动到check方法的局部作用域内,这样每次只需要为当前的n值创建一个临时数组,而不是每次都为整个范围创建。以下是修改后的代码:

    import java.util.*;
    
    public class Main {
        static int N;
        static long S;
    
        public static boolean check(int n) {
            long[] sum = new long[n + 2 * n - 1]; // 只为当前范围创建数组
            long tmp = 0;
            for (int i = 1; i <= n + 2 * n - 1; i++) {
                sum[i] = (i > 0 ? sum[i - 1] : 0) + sc.nextInt(); // 初始化数组
                if ((sum[i + n - 1] - sum[i - 1]) > S || (sum[i + 2 * n - 1] - sum[i + n - 1]) > S) continue;
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            N = sc.nextInt();
            S = sc.nextLong();
            int L = 1, R = 1000000;
            while (L < R) {
                int middle = (L + R + 1) / 2;
                if (check(middle)) L = middle;
                else R = middle - 1;
            }
            System.out.println(2 * L);
        }
    }
    

    通过这种方式,sum数组只在check方法的循环内部创建,从而减少了内存消耗,解决了内存超限的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月29日