[英]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--;
}
}
}
您想要完成什么? 考虑到最后一个元素是最大元素时的情况,那么您将始终打印0
因为您将永远不会设置maxLength
。
您的主要问题在这里。 因为您从列表中递归删除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.