Longest Increasing Subsequences
题目描述
最长递增子序列:
给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
示例:
输入:[2, 1, 5, 3, 6, 4, 8, 9, 7]
输出:[1, 3, 4, 8, 9]
解法
解法一:贪心 + 二分法
func LIS(arr []int) []int {
// write code here
n := len(arr)
if n == 0 {
return nil
}
max := make([]int, n)
sub := []int{arr[0]}
max[0] = 1
for i := 1; i < n; i++ {
if arr[i] > sub[len(sub)-1] {
sub = append(sub, arr[i])
max[i] = len(sub)
} else {
l, r := 0, len(sub)
for l < r {
m := l + (r-l)>>1
if sub[m] >= arr[i] {
r = m
} else {
l = m + 1
}
}
sub[l] = arr[i]
max[i] = l + 1
}
}
for i, j := len(max)-1, len(sub); j > 0; i-- {
if max[i] == j {
j--
sub[j] = arr[i]
}
}
return sub
}
Last updated
Was this helpful?