您的位置:首页 > 编程语言 > Java开发

Java求给定数组的最长递增子序列

2017-08-22 16:16 232 查看
最近一直在讨论的求解最长递增子序列问题(LIS)

参考了很多求解方法,在此记录以下代码实现,后续发现更优方法再更新

代码实现:

public int LIS(int[] a ){

int[] arr=new int[a.length];//用于记录当前个元素作为最大元素的最长递增序列的长度

for (int i = 0; i < a.length; i++) { //初始化
arr[i]=1;
}

int max=1;

for (int i = 1; i < a.length; i++) {
for (int j = 0; j <i; j++) {

if (a[j]<a[i]&&(arr[j]+1)>arr[i]) {
arr[i]=arr[j]+1;
}
if (max<arr[i]) { //得到当前最长递增序列的长度以及该子序列的最末元素的位置
max=arr[i];
}
}
}
return max;
}


以上代码返回最长递增子序列的长度,若需要返回最长的递增子序列,代码实现如下:

public ArrayList<Integer> maxSubIncreaseArray(int[] array){
int[] list = new int[array.length];
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> tmp = new ArrayList<Integer>();
int index = -1;//用于标记当前元素之前的第一个递增子序列的位置
int maxIndex = 0;//用于标记该序列的最长递增子序列的位置
int max = Integer.MIN_VALUE;//最长递增子序列的长度
list[0] = 1;//该列表用于标记包括当前元素在内的前半部分的最长递增子序列的长度
tmp.add(array[0]);
res.add(tmp);
for(int i=1;i<array.length;i++){
index = -1;
tmp = new ArrayList<Integer>();
for(int j=0;j<i;j++){
if(array[j]<array[i]&&list[j]>list[i]){
list[i] = list[j];
index = j;
}
}
++list[i];
if(index>-1)
tmp.addAll(res.get(index));
tmp.add(array[i]);
res.add(tmp);
if(list[i]>max){
max = list[i];
maxIndex = i;
}
}
return res.get(maxIndex);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: