Skip to content

test: LongestAlternatingSubsequenceTest #5399

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,73 +1,73 @@
package com.thealgorithms.dynamicprogramming;

/*

* Problem Statement: -
* Find Longest Alternating Subsequence

* A sequence {x1, x2, .. xn} is alternating sequence if its elements satisfy one of the following
relations :

x1 < x2 > x3 < x4 > x5 < …. xn or
x1 > x2 < x3 > x4 < x5 > …. xn
/**
* Class for finding the length of the longest alternating subsequence in an array.
*
* <p>An alternating sequence is a sequence of numbers where the elements alternate
* between increasing and decreasing. Specifically, a sequence is alternating if its elements
* satisfy one of the following relations:
*
* <ul>
* <li>{@code x1 < x2 > x3 < x4 > x5 < ... < xn}</li>
* <li>{@code x1 > x2 < x3 > x4 < x5 > ... > xn}</li>
* </ul>
*
* <p>This class provides a method to compute the length of the longest such subsequence
* from a given array of integers.
*/
public final class LongestAlternatingSubsequence {
private LongestAlternatingSubsequence() {
}

/* Function to return longest alternating subsequence length*/
/**
* Finds the length of the longest alternating subsequence in the given array.
*
* @param arr an array of integers where the longest alternating subsequence is to be found
* @param n the length of the array {@code arr}
* @return the length of the longest alternating subsequence
*
* <p>The method uses dynamic programming to solve the problem. It maintains a 2D array
* {@code las} where:
* <ul>
* <li>{@code las[i][0]} represents the length of the longest alternating subsequence
* ending at index {@code i} with the last element being greater than the previous element.</li>
* <li>{@code las[i][1]} represents the length of the longest alternating subsequence
* ending at index {@code i} with the last element being smaller than the previous element.</li>
* </ul>
*
* <p>The method iterates through the array and updates the {@code las} array based on
* whether the current element is greater or smaller than the previous elements.
* The result is the maximum value found in the {@code las} array.
*/
static int alternatingLength(int[] arr, int n) {
/*

las[i][0] = Length of the longest
alternating subsequence ending at
index i and last element is
greater than its previous element

las[i][1] = Length of the longest
alternating subsequence ending at
index i and last element is
smaller than its previous
element

*/
int[][] las = new int[n][2]; // las = LongestAlternatingSubsequence

// Initialize the dp array
for (int i = 0; i < n; i++) {
las[i][0] = 1;
las[i][1] = 1;
}

int result = 1; // Initialize result

/* Compute values in bottom up manner */
// Compute values in a bottom-up manner
for (int i = 1; i < n; i++) {
/* Consider all elements as previous of arr[i]*/
for (int j = 0; j < i; j++) {
/* If arr[i] is greater, then check with las[j][1] */
// If arr[i] is greater than arr[j], update las[i][0]
if (arr[j] < arr[i] && las[i][0] < las[j][1] + 1) {
las[i][0] = las[j][1] + 1;
}

/* If arr[i] is smaller, then check with las[j][0]*/
// If arr[i] is smaller than arr[j], update las[i][1]
if (arr[j] > arr[i] && las[i][1] < las[j][0] + 1) {
las[i][1] = las[j][0] + 1;
}
}

/* Pick maximum of both values at index i */
if (result < Math.max(las[i][0], las[i][1])) {
result = Math.max(las[i][0], las[i][1]);
}
// Pick the maximum of both values at index i
result = Math.max(result, Math.max(las[i][0], las[i][1]));
}

return result;
}

public static void main(String[] args) {
int[] arr = {10, 22, 9, 33, 49, 50, 31, 60};
int n = arr.length;
System.out.println("Length of Longest "
+ "alternating subsequence is " + alternatingLength(arr, n));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.thealgorithms.dynamicprogramming;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

public class LongestAlternatingSubsequenceTest {

@ParameterizedTest
@MethodSource("provideTestCases")
void testAlternatingLength(int[] arr, int expected) {
assertEquals(expected, LongestAlternatingSubsequence.alternatingLength(arr, arr.length));
}

private static Stream<Arguments> provideTestCases() {
return Stream.of(Arguments.of(new int[] {1}, 1), Arguments.of(new int[] {1, 2}, 2), Arguments.of(new int[] {2, 1}, 2), Arguments.of(new int[] {1, 3, 2, 4, 3, 5}, 6), Arguments.of(new int[] {1, 2, 3, 4, 5}, 2), Arguments.of(new int[] {5, 4, 3, 2, 1}, 2),
Arguments.of(new int[] {10, 22, 9, 33, 49, 50, 31, 60}, 6), Arguments.of(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 2));
}
}