func lengthOfLIS(nums []int) int {
f := make([]int, len(nums) + 1)
ans := 0
for i := 0; i < len(nums); i ++ {
f[i] = 1
for j := 0; j <= i ; j ++ {
if nums[i] > nums[j] {
f[i] = max(f[i], f[j] + 1)
}
ans = max(f[i], ans)
}
}
return ans
}
func max(i, j int) int {
if i < j {
return j
}
return i
}
func lengthOfLIS(nums []int) int {
f := make([]int, len(nums) + 1)
Len := 0
for i := 0; i < len(nums); i ++ {
l := 0
r := Len
for l < r {
mid := (l + r + 1) / 2
if f[mid] < nums[i] {
l = mid
} else {
r = mid - 1
}
}
Len = max(Len, r + 1)
f[r + 1] = nums[i]
}
return Len
}
func max(i, j int) int {
if i < j {
return j
}
return i
}
二刷:
func lengthOfLIS(nums []int) int {
n := len(nums)
ans := 0
f := make([]int, n)
for i := 0; i < n; i ++ {
f[i] = 1
for j := 0; j <= i; j ++ {
if nums[i] > nums[j] {
f[i] = max(f[i], f[j] + 1)
}
ans = max(f[i], ans)
}
}
return ans
}
二分优化:
func lengthOfLIS(nums []int) int {
n := len(nums)
f := make([]int, n + 1)
Len := 0
for i := 0; i < n; i ++ {
l := 0
r := Len
for l < r {
mid := (l + r + 1) / 2
if f[mid] < nums[i] {
l = mid
} else {
r = mid - 1
}
}
Len = max(Len, r + 1)
f[r + 1] = nums[i]
}
return Len
}