题解 | #最长上升子序列(一)#
最长上升子序列(一)
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 }