我不希望这里有解决方案。但我很难找出可能出现的错误。我觉得这是正确的解决方案但是,解决方案并没有通过我所有的测试用例。例如{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--;
}
}
}
}
答案 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--;
}
}
}
你想用它完成什么?考虑最后一个元素是最大元素的情况,然后您将始终打印0
,因为您永远不会设置maxLength
。
你的主要问题在这里。因为您从列表中递归删除了a[i]
,a[i+1]
。假设您有{2, 3, 100, 4, 5, 6, 1}
而不是考虑[2, 3, 4, 5, 6]
最长列表,您的代码会将[2, 4, 5, 6]
视为最长的列表。