繁体   English   中英

最长递增子序列的长度

[英]Length of Longest increasing subsequence

我不期望在这里找到解决方案。 但是我很难找出可能是什么错误。 我认为这是正确的解决方案,但是该解决方案并未通过我拥有的所有测试用例。 例如{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--;
            }
        }
    }
    }

由于您不需要任何解决方案,因此我不会为您提供任何解决方案,另一方面,您可以通过简单的搜索找到很多答案。

这是我从您的代码中了解的内容:

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,100,4,5,6,1 {2, 3, 100, 4, 5, 6, 1}而不是考虑[2, 3, 4, 5, 6]最长的列表,您的代码将考虑[2, 4, 5, 6]最长的名单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM