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

最长上升子序列(三)

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
}

全部评论

相关推荐

06-27 18:53
门头沟学院 Java
这样才知道自己不适合搞代码,考公去咯
只爱喝白开水:我也发现不适合搞代码,打算转非技术方向了
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
06-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务