在Go(Golang)中给定的输入数组中找到最长的递增子序列的方法

78 阅读1分钟

概述

目的是在一个给定的输入数组中找到最长的递增子序列。它是给定序列中最长的子序列,使得每个元素都比其前一个元素大。

比如说

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)

  • 如果没有这样的jlis[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