概述
目的是在一个给定的输入数组中找到最长的递增子序列。它是给定序列中最长的子序列,使得每个元素都比其前一个元素大。
比如说
Input: [1,5,7,6]
The longest subsequence is [1,5,6] which is of length 3
Output: 3
另一个例子
Input: [3,2,1]
The longest subsequence is either {3}, {2} or {1}. Each is of length 1
Output: 1
最长递增子序列是一个DP问题。假设输入数组只命名为输入。假设lis是一个数组,其中 lis[i] 是索引i处的最长递增子序列的长度。
那么
-
lis[0]= 1
-
lis[i] = max(lis[j])+ 1 其中0 <= j<iandinput[i]>input[j)
-
如果没有这样的j,lis[i]= 1
程序
下面是同样的程序。
package main
import "fmt"
func lengthOfLIS(nums []int) int {
lenNums := len(nums)
lis := make([]int, lenNums)
for i := 0; i < lenNums; i++ {
lis[i] = 1
}
for i := 1; i < lenNums; i++ {
for j := 0; j < i; j++ {
if nums[i] > nums[j] && lis[i] < (lis[j]+1) {
lis[i] = lis[j] + 1
}
}
}
max := 0
for i := 0; i < lenNums; i++ {
if lis[i] > max {
max = lis[i]
}
}
return max
}
func main() {
output := lengthOfLIS([]int{1, 5, 7, 6})
fmt.Println(output)
output = lengthOfLIS([]int{3, 2, 1})
fmt.Println(output)
}
输出
3
1