动态规划
作者:方勇(gopher)
- 2022 年 4 月 04 日
本文字数:942 字
阅读完需:约 3 分钟
300. 最长递增子序列
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
复制代码
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
复制代码
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
复制代码
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
进阶:
你能将算法的时间复杂度降低到
O(n log(n))
吗?
题解:
func lengthOfLIS(nums []int) int {
var solution func([]int) int // 解决方案
var max func(x, y int) int // 取最大值
max = func(x, y int) int {
if x > y {
return x
}
return y
}
solution = func(num []int) int {
var dpTable = []int{} // 动态规划 dptable
var res int // 最长子串长度
for i := 0; i < len(num); i++ {
dpTable = append(dpTable, 1) // 初始化所有dptable 值为1
}
for i := 0; i < len(num); i++ {
for j := 0; j < i; j++ { // dp[5] 为dp[1~4]中最小的统计值+1
if num[i] > num[j] {
dpTable[i] = max(dpTable[i], dpTable[j]+1)
}
}
}
for i := 0; i < len(dpTable); i++ { // 取结果的最大值
res = max(res, dpTable[i])
}
return res
}
return solution(nums)
}
复制代码
func lengthOfLIS(nums []int) int {
var solution func([]int) int // 解决方案
var max func(x, y int) int // 取最大值
max = func(x, y int) int {
if x > y {
return x
}
return y
}
solution = func(num []int) int {
length := len(num)
var dpTable = make([]int, length) // 动态规划 dptable
var res int // 最长子串长度
for i := 0; i < len(num); i++ {
_max := 0
for j := 0; j < i; j++ { // dp[5] 为dp[1~4]中最小的统计值+1
if num[i] > num[j] {
_max = max(_max, dpTable[j])
}
}
dpTable[i] = _max + 1
res = max(res, dpTable[i])
}
return res
}
return solution(nums)
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论