# Longest Monotonically Increasing Subsequence Size (N log N): Simple implementation

• Difficulty Level : Medium
• Last Updated : 28 Dec, 2021

Given an array of random numbers, find the longest monotonically increasing subsequence (LIS) in the array.
If you want to understand the O(NlogN) approach, it’s explained very clearly here.
In this post, a simple and time-saving implementation of O(NlogN) approach using stl is discussed. Below is the code for LIS O(NlogN):

## C++

 `// C++ implementation``// to find LIS``#include``#include``#include``using` `namespace` `std;` `// Return length of LIS in arr[] of size N``int` `lis(``int` `arr[], ``int` `N)``{``    ``int` `i;``    ``set<``int``> s;``    ``set<``int``>::iterator k;``    ``for` `(i=0; i

## Java

 `// Java implementation``// to find LIS``import` `java.util.*;``class` `GFG{` `// Return length of LIS``// in arr[] of size N``static` `int` `lis(``int` `arr[],``               ``int` `N)``{``  ``int` `i;``  ``HashSet s = ``new` `HashSet<>();``  ``for` `(i = ``0``; i < N; i++)``  ``{``    ``// Check if the element``    ``// was actually inserted``    ``// An element in set is``    ``// not inserted if it is``    ``// already present. Please see``    ``// https://www.geeksforgeeks.``    ``// org/set-insert-function-in-c-stl/``    ``int` `k = ``0``;``    ``int` `size = s.size();``    ``if` `(s.add(arr[i]))``    ``{``      ``// Find the position of``      ``// inserted element in iterator k``      ``if``(s.contains(arr[i]))``        ``k++; ``      ` `      ``// Find the next``      ``// greater element in set``      ``// If the new element is not``      ``// inserted at the end, then``      ``// remove the greater element``      ``// next to it.``      ``if` `(size == s.size())``        ``s.remove(k + ``1``);``    ``}``  ``}` `  ``// Note that set s may not contain``  ``// actual LIS, but its size gives``  ``// us the length of LIS``  ``return` `s.size();``}` `public` `static` `void` `main(String[] args)``{``  ``int` `arr[] = {``8``, ``9``, ``12``, ``10``, ``11``};``  ``int` `n = arr.length;``  ``System.out.print(lis(arr, n) + ``"\n"``);``}``}` `// This code is contributed by gauravrajput1`

## Python3

 `# Python implementation``# to find LIS` `# Return length of LIS``# in arr of size N``def` `lis(arr, N):``    ``s ``=` `set``();``    ``for` `i ``in` `range``(N):``      ` `        ``# Check if the element``        ``# was actually inserted``        ``# An element in set is``        ``# not inserted if it is``        ``# already present. Please see``        ``# https:#www.geeksforgeeks.``        ``# org/set-insert-function-in-c-stl/``        ``k ``=` `0``;``        ``size ``=` `len``(s);``        ``if` `(s.add(arr[i])):``          ` `            ``# Find the position of``            ``# inserted element in iterator k``            ``if` `arr[i] ``in` `s:``                ``k ``+``=` `1``;` `            ``# Find the next``            ``# greater element in set``            ``# If the new element is not``            ``# inserted at the end, then``            ``# remove the greater element``            ``# next to it.``            ``if` `(size ``=``=` `len``(s)):``                ``s.remove(k ``+` `1``);``        ` `    ``# Note that set s may not contain``    ``# actual LIS, but its size gives``    ``# us the length of LIS``    ``return` `len``(s);` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``arr ``=` `[ ``8``, ``9``, ``12``, ``10``, ``11` `];``    ``n ``=` `len``(arr);``    ``print``(lis(arr, n) ,"");` `# This code is contributed by Rajput-Ji`

## C#

 `// C# implementation``// to find LIS``using` `System;``using` `System.Collections.Generic;` `class` `GFG{``    ` `// Return length of LIS``// in arr[] of size N``static` `int` `lis(``int``[] arr, ``int` `N)``{``    ``int` `i;``    ``HashSet<``int``> s = ``new` `HashSet<``int``>();``    ``for``(i = 0; i < N; i++)``    ``{``        ` `        ``// Check if the element was actually inserted``        ``// An element in set is not inserted if it is``        ``// already present. Please see``        ``// https://www.geeksforgeeks.org/set-insert-function-in-c-stl/``        ``int` `k = 0;``        ``int` `size = s.Count;``        ` `        ``if` `(s.Add(arr[i]))``        ``{``            ` `            ``// Find the position of inserted``            ``// element in iterator k``            ``if` `(s.Contains(arr[i]))``                ``k++;``            ` `            ``// Find the next greater element in set``            ``// If the new element is not inserted at``            ``// the end, then remove the greater element``            ``// next to it.``            ``if` `(size == s.Count)``                ``s.Remove(k + 1);``        ``}``    ``}``    ` `    ``// Note that set s may not contain``    ``// actual LIS, but its size gives``    ``// us the length of LIS``    ``return` `s.Count;``}` `// Driver code``static` `public` `void` `Main()``{``    ``int``[]    arr = { 8, 9, 12, 10, 11 };``    ``int` `n = arr.Length;``    ` `    ``Console.Write(lis(arr, n) + ``"\n"``);``}``}` `// This code is contributed by avanitrachhadiya2155`

## Javascript

 ``
Output
```4
```