LeetCode300. 最长递增子序列【动态规划】

news/2024/7/5 4:51:35

难度:中等
题目描述:

给你一个整数数组 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

时间复杂度O(n2)

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        int max_len = 1;
        int dp[n];
        for(int i=0;i<n;i++){
            dp[i]=1;
            for(int j=0; j<i; j++){
                if(nums[j] < nums[i]){
                    dp[i] = max(dp[j]+1, dp[i]);
                    if(dp[i] > max_len){
                        max_len = dp[i];
                    }
                }
            }
        }
        return max_len;
    }
};

时间复杂度O(nlogn)

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        int dp[n];
        dp[0] = nums[0];
        int dp_len = 1;
        for(int i=1;i<n;i++){
            if(nums[i]>=dp[dp_len-1]){
                if(nums[i]>dp[dp_len-1])
                    dp[dp_len++]=nums[i];
            }else if(nums[i]<=dp[0]){
                dp[0]=nums[i];
            }else{
                int l=0,r=dp_len-1,mid=0;
                while(l<=r){
                    mid=(l+r)/2;
                    if(dp[mid]==nums[i]){
                        break;
                    }
                    else if(dp[mid]>nums[i]){
                        if(l == r){
                            break;
                        }
                        r=mid;
                    }else{
                        l=mid+1;
                    }
                }
                dp[mid]=nums[i];
            }
        }
        return dp_len;
    }
};

http://www.niftyadmin.cn/n/4137514.html

相关文章

Day2 数据类型、数据运算、数据字典

1.数字&#xff1a;int&#xff08;整型&#xff09; 32位机器&#xff1a;-2**31~2**31-1 64位机器&#xff1a;-2**63~2**63-1 float&#xff08;浮点型&#xff09; 2.布尔值 真或假 1或0 bool(0) 3.字符串 name “wanghuafeng” print(“my name is ” name “and you?”…

用Lucene实现分组,facet功能,FieldCache

假如你像用lucene来作分组&#xff0c;比如按类别分组&#xff0c;这种功能&#xff0c;好了你压力大了&#xff0c;lucene本身是不支持分组的。 当你想要这个功能的时候&#xff0c;就可能会用到基于lucene的搜索引擎solr。 不过也可以通过编码通过FieldCache和单字段&#xf…

I.MX6 wpa_supplicant_8 编译问题

/************************************************************************* I.MX6 wpa_supplicant_8 编译问题* 说明&#xff1a;* 在移植wifi过程中&#xff0c;要编译wpa_supplicant_8这个模块&#xff0c;记录一下问题。** …

LeetCode206. 反转链表

难度&#xff1a;简单 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr)…

SQL Server中一个隐性的IO性能杀手-Forwarded record

SQL Server中一个隐性的IO性能杀手-Forwarded record 原文:SQL Server中一个隐性的IO性能杀手-Forwarded record简介 最近在一个客户那里注意到一个计数器很高&#xff08;Forwarded Records/Sec&#xff09;&#xff0c;伴随着间歇性的磁盘等待队列的波动。本篇文章分享什么是…

reactjs学习笔记2--组件的介绍

什么是组件 组件就像是乐高积木&#xff0c;一个完整的房子&#xff0c;可以由砖头一块一块的组成&#xff0c;一块砖头&#xff0c;就可以称为一个组件。 如何创建组件 调用 React.createClass 方法&#xff0c;传入的参数为一个对象&#xff0c;对象必须定义一个 render 方法…

textarea焦点的用法(转)

1.文本框显示默认文字&#xff1a; <textarea>白鸽男孩</textarea> <textarea>白鸽男孩</textarea>   2.鼠标点击文本框&#xff0c;默认文字消失&#xff1a; <textarea οnfοcus”if(value’白鸽男孩’) {value’ ‘}”>白鸽男孩&…

RecyclerView notifyDataSetChanged不起作用

一般listview设置完data后调用notifyDataSetChanged便可刷新布局界面&#xff0c;然而recycleview调用这个方法却没有任何反应。对于很多不熟悉recycleview的话很容易躺坑&#xff0c;折腾了好久。在此记录下。一、recycleview刷新&#xff1a;设置相关属性&#xff1a; recycl…