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

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条回答 默认 最新

  • 关注

    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日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂