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

来源:互联网 发布:android电视直播软件 编辑:程序博客网 时间:2024/06/05 05:37

最近一直在讨论的求解最长递增子序列问题(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);    }}