美文网首页
2022-03-12最长递增子序列longest-increas

2022-03-12最长递增子序列longest-increas

作者: 羲牧 | 来源:发表于2022-03-12 17:00 被阅读0次

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

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

    示例 1:

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

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

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

    动态规划

    C++语言版本

    class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int result = 0;
            // dp[j] 表示以j结尾的最长递增子序列的长度
            vector<int> dp(nums.size(), 1);
            for(int j = 0; j < nums.size(); j ++){
                for(int i = 0; i < j; i++){
                    if(nums[i] < nums[j]){
                        dp[j] = max(dp[j], dp[i]+1);
                    }
                }
                result = max(result, dp[j]);
            }
            return result;
    
        }
    };
    

    go语言版本

    func lengthOfLIS(nums []int) int {
        result := 0;
        length := len(nums);
        dp := make([]int, length);
        for j := 0; j < length; j++{
            dp[j] = 1;
            for i := 0; i < j; i++{
                if nums[i] < nums[j]{
                    if dp[i]+1 > dp[j]{
                        dp[j] = dp[i]+1;
                    }
                }
            }
            if dp[j] > result{
                result = dp[j];
            }
        }
        return result;
    
    }
    

    python3语言版本

    class Solution:
        def lengthOfLIS(self, nums: List[int]) -> int:
            result = 0
            dp = [1]*len(nums)
            for j in range(0, len(nums)):
                for i in range(0, j):
                    if nums[i] < nums[j] and dp[i]+1 > dp[j]:
                        dp[j] = dp[i]+1
                result = dp[j] if dp[j] > result else result
            return result
    

    二分查找

    class Solution:
        def lengthOfLIS(self, nums: List[int]) -> int:
            # 开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。
            stack = list()
            for e in nums:
                if not stack or stack[-1] < e:
                    stack.append(e)
                else:
                    # 二分查找,寻找第一个大于e的数
                    low = 0
                    high = len(stack) - 1
                    while low <= high:
                        mid = low + (high-low)//2
                        if e > stack[mid]:
                            low = mid + 1
                        else:
                            high = mid -1
                    stack[low] = e
            return len(stack)
    

    相关文章

      网友评论

          本文标题:2022-03-12最长递增子序列longest-increas

          本文链接:https://www.haomeiwen.com/subject/swikdrtx.html