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

最长上升子序列(一)

https://www.nowcoder.com/practice/5164f38b67f846fb8699e9352695cd2f

package main


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 给定数组的最长严格上升子序列的长度。
 * @param arr int整型一维数组 给定的数组
 * @return int整型
 */
func LIS(arr []int) int {
	// write code here
	if len(arr) < 2 {
		return len(arr)
	}
	dpLen := make([]int, len(arr))
	dpLen[0] = 1
	for i := 1; i < len(arr); i++ {
		smallerValPos := -1
		tmp := 0
		for j := i - 1; j >= 0; j-- {
			if arr[i] >= arr[j] {
				//i和j之间是递增序列关系;
				if dpLen[j] > tmp {
					smallerValPos = j
					tmp = dpLen[j]
				}
			}
		}
		//前面符合条件的最长序列结尾元素位置a
		if smallerValPos == -1 { //没有更小的元素位置
			dpLen[i] = 1
		} else {
			dpLen[i] = tmp + 1
		}
	}
	//遍历一次拿到最长子序列的长度和结尾元素位置
	mxLen := 0
	for i := 0; i < len(dpLen); i++ {
		if dpLen[i] > mxLen {
			mxLen = dpLen[i]
		}
	}
	return mxLen
}

全部评论

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务