Given N elements, write a program that prints the length of the longest increasing consecutive subsequence.
Examples:
Input : a[] = {3, 10, 3, 11, 4, 5, 6, 7, 8, 12}
Output : 6
Explanation: 3, 4, 5, 6, 7, 8 is the longest increasing subsequence whose adjacent element differs by one.Input : a[] = {6, 7, 8, 3, 4, 5, 9, 10}
Output : 5
Explanation: 6, 7, 8, 9, 10 is the longest increasing subsequence
Naive Approach: For every element, find the length of the subsequence starting from that particular element. Print the longest length of the subsequence thus formed:
C++
#include <bits/stdc++.h>using namespace std;int LongestSubsequence(int a[], int n){ int ans = 0; // Traverse every element to check if any // increasing subsequence starts from this index for(int i=0; i<n; i++) { // Initialize cnt variable as 1, which defines // the current length of the increasing subsequence int cnt = 1; for(int j=i+1; j<n; j++) if(a[j] == (a[i]+cnt)) cnt++; // Update the answer if the current length is // greater than already found length ans = max(ans, cnt); } return ans;}int main(){ int a[] = { 3, 10, 3, 11, 4, 5, 6, 7, 8, 12 }; int n = sizeof(a) / sizeof(a[0]); cout << LongestSubsequence(a, n); return 0;} |
Java
import java.util.Scanner;public class Main { public static int LongestSubsequence(int a[], int n) { int ans = 0; // Traverse every element to check if any // increasing subsequence starts from this index for(int i=0; i<n; i++) { // Initialize cnt variable as 1, which defines // the current length of the increasing subsequence int cnt = 1; for(int j=i+1; j<n; j++) if(a[j] == (a[i]+cnt)) cnt++; // Update the answer if the current length is // greater than already found length if(cnt > ans) ans = cnt; } return ans; } public static void main(String[] args) { int[] a = { 3, 10, 3, 11, 4, 5, 6, 7, 8, 12}; int n = a.length; System.out.println(LongestSubsequence(a, n)); }}// This code contributed by Ajax |
Python3
def longest_subsequence(a, n): ans = 0 # Traverse every element to check if any # increasing subsequence starts from this index for i in range(n): # Initialize cnt variable as 1, which defines # the current length of the increasing subsequence cnt = 1 for j in range(i + 1, n): if a[j] == (a[i] + cnt): cnt += 1 # Update the answer if the current length is # greater than the already found length ans = max(ans, cnt) return ansif __name__ == "__main__": a = [3, 10, 3, 11, 4, 5, 6, 7, 8, 12] n = len(a) print(longest_subsequence(a, n)) |
C#
using System;class GFG{ static int LongestSubsequence(int[] a, int n) { int ans = 0; // Traverse every element to check if any // increasing subsequence starts from this index for (int i = 0; i < n; i++) { // Initialize cnt variable as 1, which defines // current length of the increasing subsequence int cnt = 1; for (int j = i + 1; j < n; j++) { if (a[j] == (a[i] + cnt)) { cnt++; } // Update the answer if the current length is // greater than the already found length ans = Math.Max(ans, cnt); } } return ans; } static void Main() { int[] a = { 3, 10, 3, 11, 4, 5, 6, 7, 8, 12 }; int n = a.Length; Console.WriteLine(LongestSubsequence(a, n)); }} |
Javascript
function LongestSubsequence(a, n){ let ans = 0; // Traverse every element to check if any // increasing subsequence starts from this index for(let i=0; i<n; i++) { // Initialize cnt variable as 1, which defines // the current length of the increasing subsequence let cnt = 1; for(let j=i+1; j<n; j++) if(a[j] == (a[i]+cnt)) cnt++; // Update the answer if the current length is // greater than already found length ans = Math.max(ans, cnt); } return ans;}let a = [ 3, 10, 3, 11, 4, 5, 6, 7, 8, 12 ];let n = a.length;console.log(LongestSubsequence(a, n)); |
6
Time Complexity: O(N2)
Auxiliary Space: O(1)
Dynamic Programming Approach: Let DP[i] store the length of the longest subsequence which ends with A[i]. For every A[i], if A[i]-1 is present in the array before i-th index, then A[i] will add to the increasing subsequence which has A[i]-1. Hence, DP[i] = DP[ index(A[i]-1) ] + 1. If A[i]-1 is not present in the array before i-th index, then DP[i]=1 since the A[i] element forms a subsequence which starts with A[i]. Hence, the relation for DP[i] is:
If A[i]-1 is present before i-th index:
- DP[i] = DP[ index(A[i]-1) ] + 1
else:
- DP[i] = 1
Given below is the illustration of the above approach:
C++
// CPP program to find length of the// longest increasing subsequence// whose adjacent element differ by 1#include <bits/stdc++.h>using namespace std;// function that returns the length of the// longest increasing subsequence// whose adjacent element differ by 1int longestSubsequence(int a[], int n){ // stores the index of elements unordered_map<int, int> mp; // stores the length of the longest // subsequence that ends with a[i] int dp[n]; memset(dp, 0, sizeof(dp)); int maximum = INT_MIN; // iterate for all element for (int i = 0; i < n; i++) { // if a[i]-1 is present before i-th index if (mp.find(a[i] - 1) != mp.end()) { // last index of a[i]-1 int lastIndex = mp[a[i] - 1] - 1; // relation dp[i] = 1 + dp[lastIndex]; } else dp[i] = 1; // stores the index as 1-index as we need to // check for occurrence, hence 0-th index // will not be possible to check mp[a[i]] = i + 1; // stores the longest length maximum = max(maximum, dp[i]); } return maximum;}// Driver Codeint main(){ int a[] = { 4, 3, 10, 3, 11, 4, 5, 6, 7, 8, 12 }; int n = sizeof(a) / sizeof(a[0]); cout << longestSubsequence(a, n); return 0;} |
Java
// Java program to find length of the// longest increasing subsequence// whose adjacent element differ by 1import java.util.*;class lics { static int LongIncrConseqSubseq(int arr[], int n) { // create hashmap to save latest consequent // number as "key" and its length as "value" HashMap<Integer, Integer> map = new HashMap<>(); // put first element as "key" and its length as "value" map.put(arr[0], 1); for (int i = 1; i < n; i++) { // check if last consequent of arr[i] exist or not if (map.containsKey(arr[i] - 1)) { // put the updated consequent number // and increment its value(length) map.put(arr[i], map.get(arr[i] - 1) + 1); // remove the last consequent number map.remove(arr[i] - 1); } // if there is no last consequent of // arr[i] then put arr[i] else { map.put(arr[i], 1); } } return Collections.max(map.values()); } // driver code public static void main(String args[]) { // Take input from user Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int arr[] = new int[n]; for (int i = 0; i < n; i++) arr[i] = sc.nextInt(); System.out.println(LongIncrConseqSubseq(arr, n)); }}// This code is contributed by CrappyDoctor |
Python3
# python program to find length of the # longest increasing subsequence # whose adjacent element differ by 1 from collections import defaultdictimport sys# function that returns the length of the # longest increasing subsequence # whose adjacent element differ by 1 def longestSubsequence(a, n): mp = defaultdict(lambda:0) # stores the length of the longest # subsequence that ends with a[i] dp = [0 for i in range(n)] maximum = -sys.maxsize # iterate for all element for i in range(n): # if a[i]-1 is present before i-th index if a[i] - 1 in mp: # last index of a[i]-1 lastIndex = mp[a[i] - 1] - 1 # relation dp[i] = 1 + dp[lastIndex] else: dp[i] = 1 # stores the index as 1-index as we need to # check for occurrence, hence 0-th index # will not be possible to check mp[a[i]] = i + 1 # stores the longest length maximum = max(maximum, dp[i]) return maximum# Driver Code a = [3, 10, 3, 11, 4, 5, 6, 7, 8, 12]n = len(a)print(longestSubsequence(a, n))# This code is contributed by Shrikant13 |
C#
// C# program to find length of the// longest increasing subsequence// whose adjacent element differ by 1using System;using System.Collections.Generic;class GFG{ static int longIncrConseqSubseq(int []arr, int n){ // Create hashmap to save // latest consequent number // as "key" and its length // as "value" Dictionary<int, int> map = new Dictionary<int, int>(); // Put first element as "key" // and its length as "value" map.Add(arr[0], 1); for (int i = 1; i < n; i++) { // Check if last consequent // of arr[i] exist or not if (map.ContainsKey(arr[i] - 1)) { // put the updated consequent number // and increment its value(length) map.Add(arr[i], map[arr[i] - 1] + 1); // Remove the last consequent number map.Remove(arr[i] - 1); } // If there is no last consequent of // arr[i] then put arr[i] else { if(!map.ContainsKey(arr[i])) map.Add(arr[i], 1); } } int max = int.MinValue; foreach(KeyValuePair<int, int> entry in map) { if(entry.Value > max) { max = entry.Value; } } return max;}// Driver codepublic static void Main(String []args){ // Take input from user int []arr = {3, 10, 3, 11, 4, 5, 6, 7, 8, 12}; int n = arr.Length; Console.WriteLine(longIncrConseqSubseq(arr, n));}}// This code is contributed by gauravrajput1 |
Javascript
<script>// JavaScript program to find length of the// longest increasing subsequence// whose adjacent element differ by 1// function that returns the length of the// longest increasing subsequence// whose adjacent element differ by 1function longestSubsequence(a, n){ // stores the index of elements var mp = new Map(); // stores the length of the longest // subsequence that ends with a[i] var dp = Array(n).fill(0); var maximum = -1000000000; // iterate for all element for (var i = 0; i < n; i++) { // if a[i]-1 is present before i-th index if (mp.has(a[i] - 1)) { // last index of a[i]-1 var lastIndex = mp.get(a[i] - 1) - 1; // relation dp[i] = 1 + dp[lastIndex]; } else dp[i] = 1; // stores the index as 1-index as we need to // check for occurrence, hence 0-th index // will not be possible to check mp.set(a[i], i + 1); // stores the longest length maximum = Math.max(maximum, dp[i]); } return maximum;}// Driver Codevar a = [3, 10, 3, 11, 4, 5, 6, 7, 8, 12];var n = a.length;document.write( longestSubsequence(a, n));</script> |
6
Complexity Analysis:
- Time Complexity: O(N), as we are using a loop to traverse N times.
- Auxiliary Space: O(N), as we are using extra space for dp and map m.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
