题解 | #最长上升子序列(三)#

最长上升子序列(三)

https://www.nowcoder.com/practice/9cf027bf54714ad889d4f30ff0ae5481

package main

/**
 * retrun the longest increasing subsequence
 * @param arr int整型一维数组 the array
 * @return int整型一维数组
*/
type LNode struct {
	val int
	pre *LNode
}

func LIS(arr []int) []int {
	dp := make([]*LNode, 0)
	for _, a := range arr {
		l := 0
		r := len(dp) - 1
		for l <= r {
			mid := (l + r) / 2
			if a > dp[mid].val {
				l = mid + 1
			} else {
				r = mid - 1
			}
		}
		if l == 0 && len(dp) > 0 && dp[l].val <= a {
			continue
		}
		node := &LNode{val: a}
		if r >= 0 {
			node.pre = dp[r]
		}
		if l < len(dp) {
			dp[l] = node
		} else {
			dp = append(dp, node)
		}
	}
	a := make([]int, 0)
	if len(dp) > 0 {
		p := dp[len(dp)-1]
		for p != nil {
			a = append(a, p.val)
			p = p.pre
		}
		n := len(a)
		for i := 0; i < n/2; i++ {
			a[i], a[n-1-i] = a[n-1-i], a[i]
		}
	}
	return a
	// write code here
}

全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务