最长的子序列的长度

时间:2017-06-05 06:25:29

标签: java algorithm recursion dynamic-programming

我不希望这里有解决方案。但我很难找出可能出现的错误。我觉得这是正确的解决方案但是,解决方案并没有通过我所有的测试用例。例如{2,2}。下面是我用蛮力(最坏情况 - n!复杂度)方法编写的代码。任何帮助将不胜感激。我不期待解决方案,但想知道我哪里出错了以及如何做到正确。

 package org.practice;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.List;

    public class LengthofLIS {
        int maxLength = 0;

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            LengthofLIS l = new LengthofLIS();
            int[] nums = { 2,2 };
            l.lengthOfLIS(nums);
        }

        public int lengthOfLIS(int[] nums) {
            if (nums.length == 1)
                return nums.length;
            List<Integer> hs = new LinkedList<>();
            dfs(nums, 0, 0, nums.length - 1, hs);
            System.out.println(maxLength);
            return maxLength;
        }

        public void dfs(int[] nums, int index, int length, int end, List<Integer> hs) {

        if (index > end) {
            return;
        }

        for (int i = index; i <= end; i++) {

            if (hs.size() == 0) {
                hs.add(nums[i]);
                length++;
            } else if (nums[i] > hs.get(hs.size() - 1)) {
                hs.add(nums[i]);
                length++;
            }

            else if (nums[i] <= hs.get(hs.size() - 1))
                continue;

            dfs(nums, i + 1, length, end, hs);
            //System.out.println("Printing " + Arrays.asList(hs));
            maxLength = Math.max(maxLength, hs.size());

            if (maxLength == nums.length)
                break;

            if (hs.size() != 0) {
                hs.remove(hs.get(hs.size() - 1));
                length--;
            }
        }
    }
    }

1 个答案:

答案 0 :(得分:3)

由于您没有要求任何解决方案,我不会为您提供一个解决方案,另一方面,您只需通过简单的搜索即可找到大量答案。

以下是我从您的代码中理解的内容:

public void dfs(int[] nums, int index, int length, int end, List<Integer> hs) {
    if (index > end) {
        return;
    }
    for (int i = index; i <= end; i++) {
        if (hs.size() == 0) {
            hs.add(nums[i]);
            length++;
        }
        else if (nums[i] > hs.get(hs.size() - 1)) {
            hs.add(nums[i]);
            length++;
        }
        else if (i == end && nums[i] < hs.get(hs.size() - 1)) { //(1) 
            maxLength = Math.max(maxLength, hs.size());
        }
        else if (nums[i] < hs.get(hs.size() - 1))
            continue;
        dfs(nums, i + 1, length, end, hs);
        if (hs.size() != 0) { //(2)
            hs.remove(hs.get(hs.size() - 1));
            length--;
        }
    }
}
  1. 你想用它完成什么?考虑最后一个元素是最大元素的情况,然后您将始终打印0,因为您永远不会设置maxLength

  2. 你的主要问题在这里。因为您从列表中递归删除了a[i]a[i+1]。假设您有{2, 3, 100, 4, 5, 6, 1}而不是考虑[2, 3, 4, 5, 6]最长列表,您的代码会将[2, 4, 5, 6]视为最长的列表。