Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ResearcherOne/e2fd52ae384fac0608b686d7ceb6366c to your computer and use it in GitHub Desktop.
Save ResearcherOne/e2fd52ae384fac0608b686d7ceb6366c to your computer and use it in GitHub Desktop.
LongestIncreasingSubsequenceDetector v2
import java.util.Arrays;
public class LongestIncreasingSubsequenceDetector {
private int[] extractedLongestIncreasingSubsequence;
private int extractedLongestIncreasingSubsequenceLength;
private int extractedLongestIncreasingSubsequenceEndingIndex;
private int extractedLongestIncreasingSubsequenceStartingIndex;
private int[] optResults;
private int[] initialNumberSequence;
LongestIncreasingSubsequenceDetector(int[] numberSequence) {
initialNumberSequence = numberSequence;
int numberSequenceLength = numberSequence.length;
optResults = new int[numberSequenceLength]; //any opt can be at minimum 1, initial value of 0 refers to uninitialized cell
calculateEveryOpt();
int maximumOptIndex = getMaximumOptIndex();
int maximumOptValue = optResults[maximumOptIndex];
extractedLongestIncreasingSubsequenceStartingIndex = maximumOptIndex;
extractedLongestIncreasingSubsequenceEndingIndex = maximumOptIndex + maximumOptValue - 1;
extractedLongestIncreasingSubsequenceLength = maximumOptValue;
extractedLongestIncreasingSubsequence = Arrays.copyOfRange(numberSequence, extractedLongestIncreasingSubsequenceStartingIndex, extractedLongestIncreasingSubsequenceEndingIndex+1);
}
public int[] getLongestIncreasingSubsequence() { //Return highest OPT
return extractedLongestIncreasingSubsequence;
}
public int getLongestIncreasingSubsequenceLength() {
return extractedLongestIncreasingSubsequenceLength;
}
public int getLongestIncreasingSubsequenceEndingIndex() {
return extractedLongestIncreasingSubsequenceEndingIndex;
}
public int getLongestIncreasingSubsequenceStartingIndex() {
return extractedLongestIncreasingSubsequenceStartingIndex;
}
public int[] getOptValues() {
return optResults;
}
public int longestIncreasingSubsequenceLengthThatStartsFromIndex(int startingIndex) {
return OPT(startingIndex, initialNumberSequence);
}
private void calculateEveryOpt() {
for(int i=0; i<initialNumberSequence.length;i++) {
int length = this.longestIncreasingSubsequenceLengthThatStartsFromIndex(i);
System.out.println("Longest subsequence's length that exactly starts at index "+i+" is "+length);
}
}
private int getMaximumOptIndex() {
int maxLength = 0;
int maxIndex = 0;
for(int i=0; i<optResults.length; i++) {
if(optResults[i] > maxLength) {
maxLength = optResults[i];
maxIndex = i;
}
}
return maxIndex;
}
private int OPT(int j, int[] numberSequence) { //longest increasing sub sequence that exactly starts from j
if(j == numberSequence.length-1) { //Special case: Last number's length at the sequence, is one. We already know it.
if(optResults[j]==0) {
System.out.println("OPT("+j+"): MISS");
optResults[j] = 1;
} else {
System.out.println("OPT("+j+"): HIT");
}
return optResults[j];
} else {
boolean isNextNumberSmaller = (numberSequence[j+1] <= numberSequence[j]);
if(isNextNumberSmaller) { //Then, this is subsequence with length 1
if(optResults[j]==0) {
System.out.println("OPT("+j+"): MISS");
optResults[j] = 1;
} else {
System.out.println("OPT("+j+"): HIT");
}
return optResults[j];
} else {
if(optResults[j]==0) {
System.out.println("OPT("+j+"): MISS");
optResults[j] = 1 + OPT(j+1, numberSequence);
} else {
System.out.println("OPT("+j+"): HIT");
}
return 1+optResults[j+1];
}
}
}
}
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numberSequence = new int[]{1,2,3,1,2,3};
LongestIncreasingSubsequenceDetector LISD = new LongestIncreasingSubsequenceDetector(numberSequence);
System.out.println("\n --RESULTS--");
System.out.println("Input number sequence: "+Arrays.toString(numberSequence));
System.out.println("");
System.out.println("Longest subsequence starting index: "+LISD.getLongestIncreasingSubsequenceStartingIndex());
System.out.println("Longest subsequence length: "+LISD.getLongestIncreasingSubsequenceLength());
System.out.println("Longest number sequence: "+Arrays.toString(LISD.getLongestIncreasingSubsequence()));
System.out.println("");
System.out.println("OPT Values: "+Arrays.toString(LISD.getOptValues()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment