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

最长上升子序列(一)

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

如何体现上升的逻辑?

定义DP数组存放的是以当前位置i结尾的子序列中的最长上升子序列长度,此时可以在0到i的所有子数组中寻找上升子序列,因为是0到i的子数组,所以保证了j<i,所以当arr[j]<arr[i]时,说明i是上升子序列的一部分,则此时以arr[i]结尾的上升子序列长度为dp[i]=1+dp[j]。

如何思考状态转移方程?

在0到i的子数组中,遍历每个子数组时都更新dp[i]为当前子数组中以arr[i]结尾的最大子序列长度,dp[i] = max(dp[i], dp[j]+1)

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 给定数组的最长严格上升子序列的长度。
 * @param arr int整型一维数组 给定的数组
 * @return int整型
 */
function LIS( arr ) {
    // write code here
    const dp = new Array(arr.length).fill(1);  // 存放以每个位置结尾的子序列中的最长上升子序列长度,因为数组中至少有一个元素,而且要更新最大值,因此初始值设置为最小值1

    for (let i = 0; i < arr.length; ++i) {
        for (let j = 0; j < i; ++j) {  // 求从0到i的子数组中的最长上升子序列长度
            if (arr[j] <= arr[i]) {  // 体现上升逻辑,arr[i]是子序列的末尾,且arr[j] < arr[i]说明是上升的,此时更新dp[i]即以arr[i]为上升子序列末尾的最大长度
                dp[i] = Math.max(dp[j]+1, dp[i]);
            }
        }
    }

    return arr.length === 0? 0 : Math.max(...dp);  // 找到所有位置为上升子序列末尾时的最长子序列长度,注意可能有空数组的情况
}
console.log(LIS([6,3,1,5,2,3,7]))
module.exports = {
    LIS : LIS
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
你找工作的时候用AI吗?
点赞 评论 收藏
分享
机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务