leetcode 300. 最长上升子序列

题目

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

说明:

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。

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

思路

先写了一个时间复杂度为O(n*n)的动态规划算法。

  1. 用一个数组dp[] 记录每个位置的最大递增子序列的长度
  2. 第1个数的最大递增子序列的长度为1, 所以 dp[0] = 1
  3. 判断第2个数是否比前面的某个数值大,如果比它大,那么它的最大递增子序列长度就要加1
  4. 判断第n个数是否比 1~ n-1 之间的数大,如果是,记录它的值,遍历完 1~ n-1,取最大值。

代码

class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums == null || nums.length < 1){
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = 1;
        int max = 1;
        for(int i = 1; i < nums.length;i++){
            int temp = 1;
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j] && dp[j] >= temp){
                    temp = dp[j]+1;
                }
                dp[i] = temp;
                if(temp > max){
                    max = temp;
                }
            }
        }
        return max;
    }
}

要求 O(n*logN)时间复杂度的算法

没想起来。。。等看看书再补上。。。反正线性数组要求 logN复杂度 一般都要用二分法—。—

原文地址:https://www.cnblogs.com/magicya/p/10575659.html

时间: 2024-10-08 08:11:58

leetcode 300. 最长上升子序列的相关文章

leetcode 673. 最长递增子序列的个数 java

题目: 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7].示例 2: 输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5.注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数. 解题: 方法:动态规划 假设对于以 nums[i] 结尾的序列,我们知道最长序列的长度 le

Leetcode 594.最长和谐子序列

最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5,2,3,7] 输出: 5 原因: 最长的和谐数组是:[3,2,2,2,3]. 说明: 输入的数组长度最大不超过20,000. 思路: 将数组中的元素作为key,该元素出现次数作为value存入哈希表.遍历哈希表,找出最长和谐子序列. 1 import java.util.HashMap; 2 3

Leetcode 673.最长递增子序列的个数

最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]. 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5. 注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数. 思路 定义 dp(n,1) cnt (n,1) 这里我用dp[i]

LeetCode 1143 最长公共子序列

链接:https://leetcode-cn.com/problems/longest-common-subsequence 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串.例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde&quo

leetcode 128. 最长连续子序列

题目描述: 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入:[100, 4, 200, 1, 3, 2] 输出:4 即最长的连续序列为 [1,2,3,4] 思路分析: 由于要求O(n)的复杂读,因此直接排序是不可行的. 这里用到的是并查集的思想.对于每一个数,去查小于1和大于1的数是否在序列中.通过迭代求解. 尽管在 for 循环中嵌套了一个 while 循环,时间复杂度看起来像是二次方级别的.但其实它是线性的算法.因为只有当 current

leetcode 594最长和谐子序列

class Solution { public: int findLHS(vector<int>& nums) { int res=0; map<int,int> m; for(auto num:nums) ++m[num]; for(auto a:m){ if (m.count(a.first+1)){ res=max(res,m[a.first]+m[a.first+1]); } } return res; } }; 原文地址:https://www.cnblogs.c

300. 最长上升子序列

1 class Solution 2 { 3 public: 4 int lengthOfLIS(vector<int>& nums) 5 { 6 if(nums.size() == 0) return 0; 7 int n = nums.size(); 8 int res = INT_MIN; 9 vector<int> dp(n,1); 10 11 for(int i = 0;i < n;i ++) 12 { 13 for(int j = 0;j < i;j

代码题(25)— 最大子序和、最长上升子序列

1.53. 最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.empty()) return 0; int res = nums[0]; int

LeetCode 300. Longest Increasing Subsequence最长上升子序列 (C++/Java)

题目: Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7,101,18] Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. Note: There may be