首页 > 试题广场 >

最长上升子序列(三)

[编程题]最长上升子序列(三)
  • 热度指数:76374 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定数组 arr ,设长度为 n ,输出 arr 的最长上升子序列。(如果有多个答案,请输出其中 按数值(注:区别于按单个字符的ASCII码值)进行比较的 字典序最小的那个)

数据范围:
要求:空间复杂度 ,时间复杂度
示例1

输入

[2,1,5,3,6,4,8,9,7]

输出

[1,3,4,8,9]
示例2

输入

[1,2,8,6,4]

输出

[1,2,4]

说明

其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个 按数值进行比较的字典序 最小,故答案为(1,2,4)         

备注:

头像 changed.
发表于 2021-07-20 14:49:29
精华题解 题意整理::对于给出的数组,要从其中找到一个子序列,满足序列中的数字是单调上升的,在满足的子序列中找到长度最长的并进行输出。子序列是指一个数组删除若干元素,但不改变其他元素相对位置形成的序列方法一:动态规划(超时)核心思想:定义为对前 个数中,以第 个数字结尾的最长上升子序列的长度,且必须被选取 展开全文
头像 华科不平凡
发表于 2020-09-15 10:16:47
两步走: 第一步——求最长递增子序列长度 第二步——求字典序靠前的子序列 对于第一步,有两种解法: 动态规划,时间复杂度为O(n^2),会超时 贪心+二分,时间复杂度为O(nlogn) 下面说说贪心+二分的解法,举例说明基本思路,假设数组arr为[2, 3, 1, 2, 3],vec数组里 展开全文
头像 码农10086号
发表于 2020-10-22 23:00:27
非原创,百度一波总结下来的: 一共需要两个辅助数组和一个辅助变量: dp数组:用来存储位置i对应的最长子序列的长度 end数组:用来存储长度为i的子序列的最后一个元素的最小值 len:用来记录当前找到的最长子序列的长度 举个例子 [3,2,5,8,6,7] end数组: i=0: 3 展开全文
头像 馒头2020
发表于 2021-01-28 11:49:25
题目描述 给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的) 示例1 输入 [2,1,5,3,6,4,8,9,7] 返回值 [1,3,4,8,9] 示例2 输入 [1,2,8,6,4] 返回值 [1,2,4] 说明 其最长递增子序列有3个,(1,2,8 展开全文
头像 别急,绕着盒子打
发表于 2021-08-18 15:24:41
这道题真的很不错,要求最长的子序列,而不是长度,而且题目设置了必须得nlogn的复杂度才能过。如果暴力的话,只需要知道最大子序列长度和以下标i元素为结尾的子序列最大长度。但是这种办法在dp时只能暴力,如果想二分查找,必须得知道每个长度的序列里的最后一个元素的最小值。因此需要维护两个数组和一个len。 展开全文
头像 xqxls
发表于 2021-12-17 19:06:52
题意整理 给定一个数组arr,求arr数组的最长上升子序列。 可能存在多个最长上升子序列,取字典序最小的那一个。 方法一(动态规划) 1.解题思路 状态定义:dp[i]dp[i]dp[i]表示以i位置元素结尾的最长上升子序列长度。 状态初始化:以每个位置结尾的上升子序列长度至少为1。 状态转移 展开全文
头像 夕闻道
发表于 2021-06-23 20:22:52
2021年华为OD笔试总结(20200621) 难度一星题1:最小合并数 输入一组整数,要求输出由输入整数中最多3个整数按任意顺序合并(拼接)成最小整数。数组大小n<100,每个输入数据的范围0<x<10000,输入数组包含的整数可能小于3个。输入输出示例: 输入: 51,2,34 展开全文
头像 Noobqxy
发表于 2020-10-13 22:59:57
较难题,超时,参考大佬的代码理清思路并重写一遍练习。Rating:[5, 4, 5] 解法:dp 1.输入输出 输入:数组arr; n = |arr| <= 10^5输出:数组ans,所有最长上升子序列中字典序最小的一个 根据输入规模,预估算法时间复杂度要小于O(n^2)。 2.递推方程 设 展开全文
头像 菜鸟也要飞的高
发表于 2020-11-19 19:36:59
import java.util.*; public class Solution { /** * retrun the longest increasing subsequence * @param arr int整型一维数组 the array * @r 展开全文
头像 牛客187993744号
发表于 2020-09-04 10:40:04
本题的本质是求最长上升子序列, 采用动态规划dp存储每个元素往前的最长子数列大小dp[i] = max(dp[i], dp[j]+1) j 为0 -i-1中比arr[i]小的子数列数据为了避免重复比较 用end数组存储最长上升子序列,当arr[i] > end[len] 时 arr[i]添加 展开全文
头像 LourisXu
发表于 2021-07-22 10:37:11
贪心+二分(1)首先,数据范围为,完全的dp做法时间复杂度为,肯定超时;(2)设数组为当前长度为的可能的最大递增子序列(不一定是字典序最小的!),可能的原因是该求法可以得到最大递增子序列的最大长度,但是保存的未必是子序列!可以模拟看下样例,以及的过程;(3)我们贪心地希望能够更长,那么希望已经构成的 展开全文

问题信息

难度:
121条回答 16795浏览

热门推荐

通过挑战的用户

查看代码
最长上升子序列(三)