LeetCode 300. Longest Increasing Subsequence

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

v2-5eb7e47f720fd110cc237c1595869209_1440w.jpg

Description



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 more than one LIS combination, it is only necessary for you to return the length.

Your algorithm should run in O(n2) complexity.


描述



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


示例:

输入: [10,9,2,5,3,7,101,18]

输出: 4

解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。


说明:

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。

你算法的时间复杂度应该为 O(n2) 。


思路



  • 这道题目使用动态规划.
  • 状态:声明一个同给定数组一样长度的数组count,数组的每个位置的值表示以当前位置的数为最后一个数,当前位置(包括当前位置)的前面的数构成串的最长递增串中数字的个数,即nums[3]=2表示前四个数中,以nums[3]为最后一个数的最大递增串中数字的个数为2.
  • 转移方程:对于第n个位置,由于我们已经知道了0到n-1每个位置的值,所以如果当前位置的元素大与0到n-1中的某个元素,当前数就能够添加到对应串的后面,即如果nums[n]大于nums[3],那么数nums[n]就可以添加到串nums[3]的后面,所以nums[n]就可能为nums[3]+1,对于nums[4],nums[5]也是同样的道理,所以count[n]为数组nums从0到n-1中所有小于nums[n]的数对应的count值加一的最大值.
  • 最终结果:count数组的最大值


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-08 18:23:33
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-08 18:23:33
class Solution:
    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 数组的个数
        length = len(nums)
        # 如果数组中没有元素或者只有一个元素,直接返回数组长度
        if length <= 1: return length
        # 动态规划,数组没个位置初始化为1
        # 表示连续递增的序列长度最下为1
        count = [1] * length
        res = 0
        for i in range(1, length):
            # 初始化为1
            _max = 1
            # 从当前位置遍历到i
            for j in range(0, i):
                # 第i个数的最大值为0到i-1中所有小于当前元素能够称的连续序列加一的最大值
                if nums[j] < nums[i]: _max = max(count[j] + 1, _max)
            # 更新当前位置的最大值
            count[i] = _max
            # 记录所有值的最大值
            res = max(res, _max)
        return res


源代码文件在这里.


目录
相关文章
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
48 0
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
50 3
LeetCode 424. Longest Repeating Character Replacem
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
104 0
LeetCode 424. Longest Repeating Character Replacem
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
74 0
LeetCode 409. Longest Palindrome
LeetCode 395. Longest Substring with At Least K
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
90 0
LeetCode 395. Longest Substring with At Least K
|
索引
LeetCode 392. Is Subsequence
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
102 0
LeetCode 392. Is Subsequence
|
Windows
LeetCode 388. Longest Absolute File Path
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
83 0
LeetCode 388. Longest Absolute File Path
LeetCode 376. Wiggle Subsequence
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
97 0
LeetCode 376. Wiggle Subsequence
LeetCode contest 183 5376. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order
LeetCode contest 183 5376. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行