给定一个由n 个整数组成的数组。问题是找到相邻元素之间的差异为 0 或 1 的子序列的最大长度。
例子:
Input : arr[] = {2, 5, 6, 3, 7, 6, 5, 8}
Output : 5
The subsequence is {5, 6, 7, 6, 5}.
Input : arr[] = {-2, -1, 5, -1, 4, 0, 3}
Output : 4
The subsequence is {-2, -1, -1, 0}.
来源: Expedia 采访经历 | 12套
此问题的解决方案与最长递增子序列问题非常相似。唯一的区别是这里我们要检查子序列相邻元素之间的绝对差是0还是1。
C++
// C++ implementation to find maximum length
// subsequence with difference between adjacent
// elements as either 0 or 1
#include
using namespace std;
// function to find maximum length subsequence
// with difference between adjacent elements as
// either 0 or 1
int maxLenSub(int arr[], int n)
{
int mls[n], max = 0;
// Initialize mls[] values for all indexes
for (int i=0; iJava
// JAVA Code for Maximum length subsequence
// with difference between adjacent elements
// as either 0 or 1
import java.util.*;
class GFG {
// function to find maximum length subsequence
// with difference between adjacent elements as
// either 0 or 1
public static int maxLenSub(int arr[], int n)
{
int mls[] = new int[n], max = 0;
// Initialize mls[] values for all indexes
for (int i = 0; i < n; i++)
mls[i] = 1;
// Compute optimized maximum length
// subsequence values in bottom up manner
for (int i = 1; i < n; i++)
for (int j = 0; j < i; j++)
if (Math.abs(arr[i] - arr[j]) <= 1
&& mls[i] < mls[j] + 1)
mls[i] = mls[j] + 1;
// Store maximum of all 'mls' values in 'max'
for (int i = 0; i < n; i++)
if (max < mls[i])
max = mls[i];
// required maximum length subsequence
return max;
}
/* Driver program to test above function */
public static void main(String[] args)
{
int arr[] = {2, 5, 6, 3, 7, 6, 5, 8};
int n = arr.length;
System.out.println("Maximum length subsequence = "+
maxLenSub(arr, n));
}
}
// This code is contributed by Arnav Kr. Mandal.
Python3
# Python implementation to find maximum length
# subsequence with difference between adjacent
# elements as either 0 or 1
# function to find maximum length subsequence
# with difference between adjacent elements as
# either 0 or 1
def maxLenSub( arr, n):
mls=[]
max = 0
#Initialize mls[] values for all indexes
for i in range(n):
mls.append(1)
#Compute optimized maximum length subsequence
# values in bottom up manner
for i in range(n):
for j in range(i):
if (abs(arr[i] - arr[j]) <= 1 and mls[i] < mls[j] + 1):
mls[i] = mls[j] + 1
# Store maximum of all 'mls' values in 'max'
for i in range(n):
if (max < mls[i]):
max = mls[i]
#required maximum length subsequence
return max
#Driver program to test above
arr = [2, 5, 6, 3, 7, 6, 5, 8]
n = len(arr)
print("Maximum length subsequence = ",maxLenSub(arr, n))
#This code is contributed by "Abhishek Sharma 44"
C#
// C# Code for Maximum length subsequence
// with difference between adjacent elements
// as either 0 or 1
using System;
class GFG {
// function to find maximum length subsequence
// with difference between adjacent elements as
// either 0 or 1
public static int maxLenSub(int[] arr, int n)
{
int[] mls = new int[n];
int max = 0;
// Initialize mls[] values for all indexes
for (int i = 0; i < n; i++)
mls[i] = 1;
// Compute optimized maximum length
// subsequence values in bottom up manner
for (int i = 1; i < n; i++)
for (int j = 0; j < i; j++)
if (Math.Abs(arr[i] - arr[j]) <= 1
&& mls[i] < mls[j] + 1)
mls[i] = mls[j] + 1;
// Store maximum of all 'mls' values in 'max'
for (int i = 0; i < n; i++)
if (max < mls[i])
max = mls[i];
// required maximum length subsequence
return max;
}
/* Driver program to test above function */
public static void Main()
{
int[] arr = { 2, 5, 6, 3, 7, 6, 5, 8 };
int n = arr.Length;
Console.Write("Maximum length subsequence = " +
maxLenSub(arr, n));
}
}
// This code is contributed by Sam007
PHP
Javascript
输出:
Maximum length subsequence = 5
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。