【问题标题】:Array Manipulation hackerrank problem in java (getting Time limit error)java中的数组操作hackerrank问题(得到时间限制错误)
【发布时间】:2020-09-09 03:47:42
【问题描述】:

我正在练习 Hackerrank 中的程序,我尝试的第一个 Hard 问题在几个测试用例中遇到了 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

    }

}

【问题讨论】:

    标签: java optimization


    【解决方案1】:

    Hackerrank 挑战不是关于编写代码,而是更多关于找到正确的算法,以减少解决方案的 Big-O。

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

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

    有了这个提示,希望你能弄明白。

    【讨论】:

    • 很抱歉,我一直在考虑,但似乎找不到任何方法。你确定它会是O(m)(不是O(n)),因为正如你所说的更糟糕的情况是a和b是1和n,所以你必须添加n个元素m次,我不知道如何我可以忽略 n 或将 arr 扔在这里。一些更多的输入或提示将不胜感激:)
    • @bha_1999 两个例子,对每个查询使用语法 a-b=k:1) n=10, m=3: 1-10=3, 2-9=4, 3-8=9 给出结果 16. --- 2) n=1000, m=3: 1-1000=3, 2-999=4, 3-998=9 给出结果 16. --- 我们可以看到, n 对结果没有意义,计算最大值不需要我们进行 1000+999+998 = 2997 次加法运算。我们可以很容易地计算出我们头脑中的最大值,那么我们是怎么做到的呢?考虑一下,因为这可能也是我们编码的方式。
    • @bha_1999 就我个人而言,当我发布针对 HackerRank 挑战的解决方案时,我将其实现为事件处理。每个查询是两个事件,一个增加值,一个减少值。我发现它比一些范围覆盖算法更容易编码。
    【解决方案2】:

    您必须避免使用第二个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;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多