Java中的数组操作hackerrank问题获取时限错误

问题描述

我正在Hackerrank中练习程序,而我尝试的第一个难题是在几个测试用例中遇到了Time Limit错误。这对我来说不是什么新鲜事,过去在编码评估测试中发生过很多次。但是,我看不到如何进一步优化它。我需要有关优化当前问题的帮助,请有人向我解释我自己进行优化的方法(对于初学者而言,我至少可以通过Hackerranks中的基本编码测试时间限制以及诸如TCS的评估考试)。

以下是Hackerrank问题的链接https://www.hackerrank.com/challenges/crush/problem

这是我的解决方案:

import java.util.Arrays;
import java.util.Scanner;

public class Solution {
    
      static long arrayManipulation(int n,int[][] queries,int m) {
          
          long arr[]= new long[n];
          
          long ans=0;
          for(int i=0;i<n;i++) //initializing zero-array (Is this necessary?)
              arr [i]=0;

            for(int i=0;i<m;i++) // for each operation
            {
                for(int j=queries[i][0];j<=queries[i][1];j++) //add given k value from index a and b 
                {
                    arr[j]=arr[j]+ queries[i][2];
                }
                
            }
            Arrays.sort(arr);

           return arr[n-1];
        }

    public static void main(String[] args) {
        
        Scanner sc= new Scanner(system.in);
        int n=sc.nextInt(); //zero-array length
        int m=sc.nextInt(); // no of operations
        
        
        int queries[][]=new int[m][3];
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<2;j++)
            {
                queries[i][j]=sc.nextInt();
                queries[i][j]-=1; //-1 cause the problem specified 1-index so I'm subtracting 1 from 1st 2 inputs
            }
            queries[i][2]=sc.nextInt();
        }
        
        long result = arrayManipulation(n,queries,m);
        System.out.println(result);
        
        
        // Todo Auto-generated method stub

    }

}

解决方法

Hackerrank面临的挑战不仅仅在于编写代码,而在于寻找正确的算法以减少解决方案的Big-O。

为此,您的代码为 O(n·m),因为最坏的情况是所有m操作都是从1n。 / p>

正确的解决方案是 O(m·log(m)),您可以通过忽略n并扔掉arr来实现。

有了提示,希望您能弄清楚。

,

您必须避免使用第二个for循环。通过一些预先计算,您可以将复杂度降低到O(n·log(n))

static long arrayManipulation(int n,int[][] queries) {
    long[] arr = new long[n];

    for (int[] query : queries) {
        int a = query[0];
        int b = query[1];
        int k = query[2];

        if (k > 0) {
            arr[a - 1] += k;

            if (b < arr.length)
                arr[b] -= k;
        }
    }

    long max = arr[0];
    long cur = arr[0];

    for (int i = 1; i < arr.length; i++) {
        cur += arr[i];
        max = cur > max ? cur : max;
    }

    return max;
}