/*
* 这个问题应该是面试的经典问题了
* 发现最长的数组的长度,并且求出最长的数组
* 【2,3,7,101]
*/
采用递归的方式和动态规划的方式进行
class Solution_LongestSubIncreasingSequence_0712{
private int[]memo;
private int getMaxLength(int[] arr,int n){
int maxlength = 1; //因为最小就是1
if(memo[n] != -1)return memo[n];
for(int i= 0;i<n;i++){
if(arr[n] > arr[i]){
maxlength = Math.max(maxlength,getMaxLength(arr,i) + 1);
}
}
memo[n] = maxlength;
return maxlength;
}
public int getMaxLength(int[] arr){
int n = arr.length;
if(n == 0) return 0;
int maxlength = 1; //因为最小就是1
memo = new int[n];
Arrays.fill(memo,-1);
for(int i = 0;i<n;i++){
maxlength = Math.max(maxlength,getMaxLength(arr,i));
}
return maxlength;
}
public int getMaxLengthDy(int[] arr){
int n = arr.length;
if(n==0) return 0;
if(n==1) return 1;
int[] memo = new int[n]; //memo[i]表示的是以i为结尾的最长增长子序列的长度
memo[0] = 1;
memo[1] = (arr[1]>arr[0]?2:1);
for(int i = 2;i<n;i++){
int maxlength = 1; //最小就是1,因为自身就是一个数
for(int j = 0;j<i;j++){
if(arr[i] > arr[j]){
maxlength = Math.max(maxlength,memo[j] + 1);
}
}
memo[i] = maxlength;
}
int lastmax = 0;
for(int i = 0;i<n;i++){
lastmax = Math.max(lastmax,memo[i]);
}
return lastmax; //这里一定要注意,最大值并不一定出现在最后的位置
}
//找到最长的长度的字符串,
//这里我考略的是使用嵌套的数组容器,这里面还有一些问题,这个字符串可能并不是一个
//输出所有的最长的路径
public void printLIS(int[] arr){
int n = arr.length;
ArrayList<LinkedList<Integer>> ls = new ArrayList<LinkedList<Integer>>();
for(int i = 0;i<n;i++){ //将元素add到每一个元素的开头
LinkedList<Integer> res = new LinkedList<Integer>();
res.add(arr[i]);
ls.add(res);
}
for(int i=0;i<n;i++){
for(int j = i;j<n;j++){
if(arr[j] > ls.get(i).getLast()){
ls.get(i).add(arr[j]);
}
}
}
int maxlength = 0;
for(int i = 0;i<n;i++){
maxlength = Math.max(maxlength,ls.get(i).size());
}
System.out.println("max length:"+maxlength);
//打印或者输出最长的
for(int i = 0;i<n;i++){
if(ls.get(i).size() == maxlength){
LinkedList<Integer> ll = ls.get(i);
StringBuilder ss = new StringBuilder();
for(int k:ll){
ss.append(new String().valueOf(k));
ss.append(",");
}
System.out.println(new String(ss));
}
}
}
}