57 最长递增子序列

news/2024/12/29 13:08:53/


给你一个整数数组 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
  • − 1 0 4 -10^4 104 <= nums[i] <= 1 0 4 10^4 104

进阶:

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

题解1 DP O ( n 2 ) O(n^{2}) O(n2)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(), 1);int maxN = INT_MIN;/**dp[i] : i处数值对应的最长子序列长度**/for(int i = 1; i < nums.size(); i++){    for(int j = 0; j < i; j++){if(nums[i] > nums[j])dp[i] = max(dp[i], dp[j]+1);}maxN = max(maxN, dp[i]);}return maxN == INT_MIN ? 1 : maxN;}
};

在这里插入图片描述

题解2 贪心+二分搜索(ref. from Leetcode) O ( n l o g ( n ) ) O(n log(n)) O(nlog(n))

“从左到右(序列顺序),维护一个每个元素尽可能小的LIS备选集合S”

每个元素尽可能小,这样更可能在末尾加上一个新的值,构成一个更大的LIS

只增加(add)和替换(swap),因此完成遍历后S的长度一定等于LIS的长度,部分元素可能被你替换掉了,所以在整个遍历过程中,这个集合S可能并不是LIS本身,尽管如此,LIS的元素一定曾出现在S中(但可能在遍历过程中被swap覆盖掉了)

鼓掌!!这个思想好棒

class Solution {
public:int lengthOfLIS(vector<int>& nums) {if(1 == nums.size()) return 1;// p[i]: 长度为i的最长上升子序列的末尾元素最小值vector<int> p(nums.size()+1, 0);int len = 1;p[len] = nums[0];for(int i = 1; i < nums.size(); i++){if(nums[i] > p[len]){len ++;p[len] = nums[i];}else{// 在i位置不用遍历得到dp值// 长度=len+1的子序列的最小值 > nums[i],为了保持p的递增,需要修改某个位置的值// 用二分找到最近的j, 满足p[j] < nums[i] < p[j+1]// s.t. p[j+1] = nums[i];// 如果找不到, 说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0int left = 1;int right = len;int pos = 0;// 最希望的是改p[len], 所以判断条件 有 =// 实际上是想不用遍历,用二分检查一遍 nums[i]是不是大于len+1情况里的倒数第二个最大的数吧while(left <= right){int mid = (left+right) >> 1;// 找到了jif(nums[i] > p[mid]){pos = mid;left = mid+1;}  else{right = mid-1;}}p[pos + 1] = nums[i];}}return len;}
};

在这里插入图片描述


http://www.ppmy.cn/news/1159257.html

相关文章

行业追踪,2023-10-17

自动复盘 2023-10-17 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

如何在Python中更新代码但还想保留原有代码

Python作为一门功能强大的编程语言&#xff0c;为开发者提供了许多方便的方法来更新代码并且还能保留原有代码。在本文中&#xff0c;我们将从多个方面来详细阐述如何在Python中更新代码但还想保留原有代码。 一、使用函数参数 许多Python程序员通过将函数的参数作为字典或者…

QT_day1

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("登录窗口");this->setWindowIcon(QIcon("C:\\Users\\EDY\\Desktop\\pictrue\\qq.png"));this->setWindowFlag(Qt::…

“1688按图搜索商品:拍立淘API,轻松实现高效购物!“

1688按图搜索商品&#xff08;拍立淘&#xff09;API的步骤大致如下&#xff1a; 需要先开放平台注册开发者账号。为每个淘宝应用注册一个应用程序键&#xff0c;登陆密钥。下载1688API的SDK并掌握基本的API基础知识和调用。利用SDK接口和对象&#xff0c;传入AppKey或者必要的…

【EI会议征稿通知】第四届电网系统与绿色能源国际学术会议(PGSGE 2024)

JPCS独立出版-第四届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2024&#xff09; 2024 4th International Conference on Power Grid Systems and Green Energy 2024年第四届电网系统与绿色能源国际学术会议(PGSGE 2024) 将于2024年01月05-07日在中国厦门召开。本次会…

Asp.net core Web Api 配置swagger中文

启动项目&#xff0c;如图&#xff1a; 原来是英文的&#xff0c;我们要中文的&#xff0c;WeatherForecastController.cs是一个示例&#xff0c;删除即可&#xff0c;WeatherForecast.cs同时删除&#xff0c;当然不删除也行&#xff0c;这里是删除&#xff0c;创建自己的控制器…

vscode配置c++和opencv环境

因为想要用c刷题&#xff0c;但是之前的vs被重装的时候删除了&#xff0c;DEVc实在是不好看的界面&#xff0c;于是就想起了之前写html的vscode&#xff0c;没想到配置环境花了一整天&#xff0c;还总是报错&#xff0c;也许是电脑配置不一样&#xff0c;所以就出了问题吧&…

【算法训练-排序算法 一】【手撕排序】快速排序、堆排序、归并排序

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【手撕排序系列】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…