首页 > 其他分享 >LeetCode 300.最长递增子序列(中等)

LeetCode 300.最长递增子序列(中等)

时间:2022-11-25 14:35:53浏览次数:60  
标签:nums 300 递增 int 数组 序列 LeetCode dp

LeetCode 300.最长递增子序列(中等)_递增子序列

题目描述

LeetCode 300.最长递增子序列(中等)_数组_02


给你一个整数数组 ​​nums​​ ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, ​​[3,6,2,7]​​​ 是数组 ​​[0,3,1,6,2,2,7]​​ 的子序列。

LeetCode 300.最长递增子序列(中等)_递增子序列

示例 1

LeetCode 300.最长递增子序列(中等)_数组_02

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

LeetCode 300.最长递增子序列(中等)_递增子序列

示例 2

LeetCode 300.最长递增子序列(中等)_数组_02


输入:nums = [0,1,0,3,2,3]
输出:4

LeetCode 300.最长递增子序列(中等)_递增子序列

示例 3

LeetCode 300.最长递增子序列(中等)_数组_02



输入:nums = [7,7,7,7,7,7,7]
输出:1

LeetCode 300.最长递增子序列(中等)_递增子序列

提示

LeetCode 300.最长递增子序列(中等)_数组_02


LeetCode 300.最长递增子序列(中等)_递增子序列_11

LeetCode 300.最长递增子序列(中等)_递增子序列

进阶

LeetCode 300.最长递增子序列(中等)_数组_02


你能将算法的时间复杂度降低到 ​​O(n log(n))​​ 吗?

LeetCode 300.最长递增子序列(中等)_递增子序列

题目分析

LeetCode 300.最长递增子序列(中等)_数组_02


这道动态规划问题我们可以采用以下的解决方案,创建一个 ​​dp​​​ 数组,其中 ​​dp[i]​​​ 表示以第 ​​i​​​ 个位置结尾的子数组的最长递增子序列长度。同时,维护一个最长递增子序列长度变量,在遍历时不断更新最大值。遍历时,对于每一个位置 ​​i​​​ ,如果其之前的某个位置 ​​j​​​ 所对应的数字小于位置 ​​i​​​ 所对应的数字,则我们可以获得一个以 ​​i​​​ 结尾的、长度为 ​​dp[j]+ 1​​ 的最长递增子序列。

LeetCode 300.最长递增子序列(中等)_递增子序列

题解

LeetCode 300.最长递增子序列(中等)_数组_02


执行用时: 59 ms

内存消耗: 41.1 MB

class Solution {
public int lengthOfLIS(int[] nums) {
// 获取数组长度
int length = nums.length;
// 如果长度为 1 返回 1
if (length == 1) {
return 1;
}
// 最长递增子序列长度
int max = 1;
// 创建 dp 数组
int[] dp = new int[length];
// dp 数组初始化
for (int i = 0; i < length; ++i) {
dp[i] = 1;
}
// 遍历数组
for (int i = 0; i < length; ++i) {
// 确定 i 位置最长递增子序列长度
for (int j = 0; j < i; ++j) {
// 如果递增
if (nums[i] > nums[j]) {
// 更新 dp[i] 为 dp[i] 与 dp[j] + 1(当前元素) 最大值
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
// 更新 最长递增子序列长度
max = Math.max(dp[i], max);
}
// 返回最长递增子序列长度
return max;
}
}

题目来源:力扣(LeetCode)


标签:nums,300,递增,int,数组,序列,LeetCode,dp
From: https://blog.51cto.com/u_15891283/5886665

相关文章

  • LeetCode 912.排序数组
    题目描述:给你一个整数数组 nums,请你将该数组升序排列。示例1:输入:nums= [5,2,3,1]输出:[1,2,3,5]示例2:输入:nums= [5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1. 1 <= nums......
  • LeetCode 15. 三数之和(中等)
    题目描述:给你一个包含​​n​​​个整数的数组​​nums​​​,判断 ​​nums​​ 中是否存在三个元素a,b,c,使得 a+b+c=0?请你找出所有和为​​0​​且不重......
  • LeetCode 16.最接近的三数之和(中等)
    题目描述:给你一个长度为​​n​​​的整数数组 ​​nums​​​ 和一个目标值 ​​target​​​。请你从​​nums​​​中选出三个整数,使它们的和与 ​​target​......
  • LeetCode 739.每日温度(中等)
    题目描述:请根据每日​​气温​​​列表​​temperatures​​​,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用​​0​​来代替......
  • LeetCode 20.有效的括号(简单)
    题目描述:给定一个只包括​​'('​​​,​​')'​​​,​​'{'​​​,​​'}'​​​,​​'['​​​,​​']'​​​ 的字符串​​s​​,判断字符串是否有效。有效字符串需满足:......
  • LeetCode 155.最小栈(简单)
    题目描述:设计一个支持​​push​​​,​​pop​​​,​​top​​操作,并能在常数时间内检索到最小元素的栈。​​push(x)​​——将元素x推入栈中。​​pop()​​ —......
  • LeetCode 769.最多能完成排序的块(中等)
    题目描述:数组​​arr​​​是​​[0,1,...,arr.length-1]​​的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • LeetCode 232.用栈实现队列(简单)
    题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(​​push​​​、​​pop​​​、​​peek​​​、​​empty​​):实现​​MyQueu......
  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......