From 4e7045137cfed30e99201b1d52eafdf26ee382d2 Mon Sep 17 00:00:00 2001 From: Alon Firestein <57404551+alonfirestein@users.noreply.github.com> Date: Wed, 24 Mar 2021 18:51:20 +0200 Subject: [PATCH] Update LongestIncreasingSubsequence.java --- .../LongestIncreasingSubsequence.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/DynamicProgramming/LongestIncreasingSubsequence.java b/DynamicProgramming/LongestIncreasingSubsequence.java index 06885fbdd..28f54afdc 100644 --- a/DynamicProgramming/LongestIncreasingSubsequence.java +++ b/DynamicProgramming/LongestIncreasingSubsequence.java @@ -9,13 +9,15 @@ public class LongestIncreasingSubsequence { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); - int ar[] = new int[n]; + int arr[] = new int[n]; for (int i = 0; i < n; i++) { - ar[i] = sc.nextInt(); + arr[i] = sc.nextInt(); } - System.out.println(LIS(ar)); + System.out.println(LIS(arr)); + System.out.println(findLISLen(arr)); sc.close(); + } private static int upperBound(int[] ar, int l, int r, int key) { @@ -56,4 +58,40 @@ public class LongestIncreasingSubsequence { return length; } + + /** @author Alon Firestein (https://github.com/alonfirestein) */ + + // A function for finding the length of the LIS algorithm in O(nlogn) complexity. + public static int findLISLen(int a[]) { + int size = a.length; + int arr[] = new int[size]; + arr[0] = a[0]; + int lis = 1; + for (int i = 1; i < size; i++) { + int index = binarySearchBetween(arr, lis, a[i]); + arr[index] = a[i]; + if (index > lis) + lis++; + } + return lis; + } + // O(logn) + private static int binarySearchBetween(int[] t, int end, int key) { + int left = 0; + int right = end; + if (key < t[0]) + return 0; + if (key > t[end]) + return end + 1; + while (left < right - 1) { + int middle = (left + right) / 2; + if (t[middle] < key) + left = middle; + else + right = middle; + } + return right; + } + + }