首页 > 其他分享 >力扣打卡8:最长上升子序列

力扣打卡8:最长上升子序列

时间:2024-12-07 21:27:47浏览次数:11  
标签:二分 nums int len 力扣 序列 打卡 mx

链接:300. 最长递增子序列 - 力扣(LeetCode)

本题我开始想到的是dp,复杂度为O(n^2),这也是很经典的解法。

看到进阶解法可以O(nlogn),想到可能是要用到二分,但是,我想到的是和map排序,再二分查找第一个比当前值小的数,再找比它小的所有数,中维护max序列,再塞到map中,可惜严格来讲还是O(n^2)。

看完官方题解,才明白要贪心来贪最小的位置,再结合二分查找,维护一条最长最优的序列。

方法一:dp

class Solution {
public:
    int a[2501];
    int lengthOfLIS(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)
        {
            int mx=0;
            for(int j=0;j<i;j++) if(nums[i]>nums[j]&&a[j]>mx) mx=a[j];
            a[i]=mx+1;
        }
        int ans=0;
        for(int i=0;i<nums.size();i++) if(ans<a[i]) ans=a[i];
        return ans;
    }
};

方法二:贪心+二分

class Solution {
public:
    int a[2501];
    int lengthOfLIS(vector<int>& nums) {
        int len=1;
        a[0]=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            int t=nums[i];
            if(t<=a[0])
            {
                a[0]=t;
                continue;
            }
            if(t>a[len-1])
            {
                a[len++]=t;
                continue;
            } 
            int l=0,r=len-1,m=0;
            while(l<r)
            {
                m=l+(r-l)/2;
                if(a[m]>=t) r=m;
                else l=m+1;
            }
            if(a[r]==t) continue;
            a[r]=t;
        }
        return len;
    }
};

标签:二分,nums,int,len,力扣,序列,打卡,mx
From: https://blog.csdn.net/Bigkinder/article/details/144295193

相关文章

  • 算法刷题打卡DFS深度搜索
    DFS概要:    要想学会深度优先搜索的题目,首先需要知道他的代码原理,适用场景基本原理:    DFS是基于遍历,搜索树,图的算法,通过从根节点(或任意起始节点)开始,沿着每个分支深入访问节点,直到到达叶子节点或没有未访问的邻居节点为止,然后回溯到上一个节点,继续搜索其他......
  • leetcode3351 好子序列的元素之和
    给定数组num[n],如果一个子序列中任意两个相邻元素的绝对差恰好为1,则称它为好子序列,返回nums中所有好子序列的元素之和,结果对1E9+7取模。注意,长度为1的子序列算好子序列。1<=n<=1E5;0<=nums[i]<=1E5分析:设f[x]表示以x结尾的所有子序列元素之和,g[x]表示以x结尾的子序列个数,从左到......
  • 【特殊子序列 DP】【hard】力扣446. 等差数列划分 II - 子序列
    给你一个整数数组nums,返回nums中所有等差子序列的数目。如果一个序列中至少有三个元素,并且任意两个相邻元素之差相同,则称该序列为等差序列。例如,[1,3,5,7,9]、[7,7,7,7]和[3,-1,-5,-9]都是等差序列。再例如,[1,1,2,5,7]不是等差序列。数组中的......
  • 力扣 630课程表iii
     原题链接题解反悔贪心,或者说是贪心+优先队列。code classSolution{public:staticboolcmp(vector<int>a,vector<int>b){if(a[1]!=b[1])returna[1]<b[1];returna[0]<b[0];}intscheduleCourse(vector<vector<int>......
  • 力扣每日打卡 92.反转链表II
    题目:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例:输入:head=[1,2,3,4,5],left=2,right=4输出:[1,4,3,2,5]提示:链表中节点数目为n1<=n<=500-500<=Node.......
  • 打卡信奥刷题(375)用C++信奥B3618[普及组/提高] 寻找团伙
    寻找团伙题目描述世界局势风云变幻,你想办一件大事。办事自然要有人参与,你能从nnn个人里面挑选一部分人共襄盛举。要办这件事,一共涉及......
  • 力扣61题 -- 旋转链表(C++)
    文章目录一、题目要求二、思路分析三、代码展示一、题目要求给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]二、思路分析以......
  • Transformer模型变长序列优化:解析PyTorch上的FlashAttention2与xFormers
    随着生成式AI(genAI)模型在应用范围和模型规模方面的持续扩展,其训练和部署所需的计算资源及相关成本也呈现显著增长趋势,模型优化对于提升运行时性能和降低运营成本变得尤为关键。作为现代genAI系统核心组件的Transformer架构及其注意力机制,由于其计算密集型的特性,成为优化的重......
  • 序列化方法
    序列化(Serialization)是将对象转换为可存储或传输的格式的过程。对于Java中的JSON序列化,通常是将Java对象转换成JSON字符串,以便传输到网络中或保存到文件中。反序列化则是将JSON字符串转换回Java对象的过程。在Jackson中,序列化的核心任务是将Java对象转换为JS......
  • 力扣 179.最大数
    原题链接题解首先,第一感觉是直接按照字符串本身大小排序再相连;但是通过样例二可知此方法错误。因此,我们重新思考,上面的排序方法错误的原因在于上述的排序满足s1<=s2,但是不满足s1+s2<=s2+s1(我们称之为加法的传递原则)。此时我们重新定义排序规则:当s1+s2<=s2+s1时就排序,否则保持......