Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最长递增子序列超时算法_Java_Performance_Algorithm_Dynamic Programming - Fatal编程技术网

Java 最长递增子序列超时算法

Java 最长递增子序列超时算法,java,performance,algorithm,dynamic-programming,Java,Performance,Algorithm,Dynamic Programming,我在HackerRank解决最长的子序列问题。我使用动态规划算法来解决最长子序列问题。我的算法的时间复杂度是O(n^2)。虽然我的解决方案给出了正确的结果,但它对于大多数测试用例都是有效的。我无法改进我的算法,使其计算结果更快。如果有人能提出任何建议,请告诉我。我的职能如下: static ArrayList<Integer> calcSolution(int[] arr) throws Exception{ ArrayList<ArrayList<Int

我在HackerRank解决最长的子序列问题。我使用动态规划算法来解决最长子序列问题。我的算法的时间复杂度是O(n^2)。虽然我的解决方案给出了正确的结果,但它对于大多数测试用例都是有效的。我无法改进我的算法,使其计算结果更快。如果有人能提出任何建议,请告诉我。我的职能如下:

static ArrayList<Integer> calcSolution(int[] arr) throws Exception{
        ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>(); 
        ArrayList<Integer> lis = new ArrayList<Integer>();

        lis.add(arr[0]);
        prev.add(lis);
        for(int i=1 ; i<arr.length ; i++){
            prev.add(new ArrayList<Integer>());
            for(int j=0 ; j<i ; j++){
                if( (arr[i] > arr[j]) && (prev.get(i).size() < (prev.get(j).size()+1)) ){
                    prev.get(i).addAll(prev.get(j));
                }
            }
            prev.get(i).add(new Integer(arr[i]));
        }

        for(int i=0 ; i<prev.size() ; i++){
            for(int j=0 ; j<prev.get(i).size(); j++){
                System.out.print(prev.get(i).get(j));
            }
            System.out.println();
        }

        lis = prev.get(0);
        for(int i=1 ; i<prev.size() ; i++){
            if(prev.get(i).size() > lis.size()){
                lis = prev.get(i);
            }
        }

        return lis;
    }
static ArrayList calcSolution(int[]arr)引发异常{
ArrayList prev=新的ArrayList();
ArrayList lis=新的ArrayList();
li.add(arr[0]);
上加(lis);

对于(inti=1;i,您的实现的时间复杂度是O(n^3),而不是O(n^2)

这是不必要和昂贵的


对于每个元素,您需要记住上一个链接以及以该链接结尾的子序列的长度。您不需要记住每个元素的实际子序列。

@Anonymous:我知道了,我在考虑最长的常见子序列问题。
prev.get(i).addAll(prev.get(j));