The largest number of problem solving sequence array
public static void main(String[] args) {
int[] arr = {1,5,2,7,4,9,10,11,8,14,13};
System.out.println(maxLISCount1(arr));
System.out.println(maxLISCount2(arr));
}
private static int maxLISCount1(int[] arr){
int[]s = new int[arr.length];
for (int i = 0; i < s.length; i++) {
s[i] = 1;
}
for (int i = 0; i < arr.length; i++) {
int item = arr[i];
for(int j=i-1;j>=0;j--){
if(arr[j]<item){
if(s[i]<s[j]+1){
s[i] = s[j]+1;
}
}
}
}
int count =0;
for (int i = 0; i < s.length; i++) {
if(count<s[i]){
count = s[i];
}
}
return count;
}
private static int maxLISCount2(int[] arr){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if(list.isEmpty()){
list.add(arr[i]);
}else {
if(list.get(list.size()-1)<arr[i]){
list.add(arr[i]);
}else {
for (int j = list.size()-1; j >= 0; j--) {
if(arr[i]<list.get(j)){
list.add(j,arr[i]);
list.remove(j+1);
break;
}
}
}
}
}
return list.size();
}
Problem solving array of maximum increasing subsequence
public static void main(String[] args) {
int[] arr = {1,5,2,7,4,9,10,11,8,14,13};
System.out.println(maxLISListOne(arr2));
List<List<Integer>> lists = maxLISListAll(arr2);
for (List<Integer> i:
lists){
System.out.println(i);
}
}
private static List<Integer> maxLISListOne(int[] arr){
int[]s = new int[arr.length];
int[] pre = new int[arr.length];
for (int i = 0; i < s.length; i++) {
s[i] = 1;
}
for (int i = 0; i < pre.length; i++) {
pre[i] = -1;
}
for (int i = 0; i < arr.length; i++) {
int item = arr[i];
for(int j=i-1;j>=0;j--){
if(arr[j]<item){
if( s[i] < s[j]+1){
s[i] = s[j]+1;
pre[i] = j;
}
}
}
}
int endIndex =0;
int count = 0;
for (int i = 0; i < s.length; i++) {
if(count<s[i]){
count = s[i];
endIndex = i;
}
}
List<Integer> result = new ArrayList<>();
while (endIndex>=0){
result.add(arr[endIndex]);
endIndex = pre[endIndex];
}
Collections.reverse(result);
return result;
}
private static List<List<Integer>> maxLISListAll(int[] arr){
int[]s = new int[arr.length];
List<List<Integer>> pres = new ArrayList<>();
for (int i = 0; i < s.length; i++) {
s[i] = 1;
}
for (int i = 0; i < arr.length; i++) {
pres.add(new ArrayList<>());
}
for (int i = 0; i < arr.length; i++) {
int item = arr[i];
for(int j=i-1;j>=0;j--){
if(arr[j]<item){
if( s[i] < s[j]+1){
s[i] = s[j]+1;
pres.get(i).clear();
pres.get(i).add(j);
}else if(s[i]==s[j]+1){
pres.get(i).add(j);
}
}
}
}
List<Integer> endIndex = new ArrayList<>();
int count = 0;
for (int i = 0; i < s.length; i++) {
if(count<s[i]){
count = s[i];
endIndex.clear();
endIndex.add(i);
}else if(count==s[i]){
endIndex.add(i);
}
}
System.out.println(pres);
List<Integer> record = new ArrayList<>();
List<List<Integer>> results = new ArrayList<>();
compose(record,pres,endIndex,arr,results);
return results;
}
private static void compose(List<Integer> record, List<List<Integer>> pres, List<Integer> endIndex,int[]arr,List<List<Integer>>results) {
if(endIndex.isEmpty()){
List<Integer> a = new ArrayList<>(record);
Collections.reverse(a);
results.add(a);
return ;
}
for (int index :
endIndex) {
record.add(arr[index]);
compose(record,pres,pres.get(index),arr,results);
record.remove(Integer.valueOf(arr[index]));
}
}