问题描述
我正在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
操作都是从1
到n
。 / 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;
}