300. 最长递增子序列 中等 两种解法 :动态规划dp 、贪心+二分
Published on 2022-11-17 23:01 in 暂未分类 with 林动

300. 最长递增子序列 中等 两种解法 :动态规划dp 、贪心+二分

    1. 最长递增子序列
      给你一个整数数组 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

    提示:

    1 <= nums.length <= 2500
    -104 <= nums[i] <= 104

    进阶:

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

    class Solution {
        public int lengthOfLIS(int[] nums) {
        	int n=nums.length;
            int f[]=new int[n];
            f[0]=1;
            int ans=1;
            for(int i=1;i<n;++i){
            	f[i]=1;
            	for(int j=0;j<i;++j){
            		if(nums[i]>nums[j]){
            			f[i]=Math.max(f[i], f[j]+1);
            		}
            	}
            }
            for(int x:f)ans=Math.max(ans, x);
            return ans;
        }
    }
    

    贪心+二分

    class Solution {
        public int lengthOfLIS(int[] nums) {
        	int len=1,n=nums.length;
        	if(n==0)return 0;
        	int d[]=new int [n+1];
        	d[len]=nums[0];
        	for(int x:nums){
        		if(x>d[len])d[++len]=x;
        		else{
        			int l=1,r=len;
        			while(l<r){
        				int mid=l+r>>1;
        				if(d[mid]>x)r=mid;
        				else l=mid+1;
        			}
        			d[l]=x;
        		}
        	}
        	return len;
        }
    }
    
    posted @   林动  阅读(8)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
    · SQL Server 2025 AI相关能力初探
    · 单线程的Redis速度为什么快?
    · AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
    · 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
    点击右上角即可分享
    微信分享提示