每日OJ题_牛客_最长上升子序列(二)_贪心+二分_C++_Java

目录

牛客_最长上升子序列(二)_贪心+二分

题目解析

C++代码

Java代码


牛客_最长上升子序列(二)_贪心+二分

最长上升子序列(二)_牛客题霸_牛客网 (nowcoder.com)

描述:

给定一个长度为 n 的数组a,求它的最长严格上升子序列的长度。

        所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。

        我们定义一个序列是 严格上升 的,当且仅当该序列不存在两个下标 i 和 j 满足 i<j 且 ai≥aj。数据范围: 0≤n≤10^5,−109<=a[i]<=109

要求:时间复杂度 O(nlogn), 空间复杂度 O(n)

示例1

输入:

[1,4,7,5,6]

返回值:

4

说明:

最长上升子序列为 [1,4,5,6] ,长度为4。 

题目解析

        在考虑最长递增子序列的长度的时候,其实并不关心这个序列长什么样子,只是关心最后⼀个元素是谁。这样新来一个元素之后,我们就可以判断是否可以拼接到它的后面。

        因此可以创建一个数组,统计长度为 x 的递增子序列中,最后一个元素是谁。为了尽可能地让这个序列更长,仅需统计长度为 x 的所有递增序列中最后一个元素的最小值。

统计的过程中发现,数组中的数呈现递增趋势,因此可以使用二分来查找插入位置。

C++代码

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0, cnt = 0;cin >> n;vector<int> v(n + 1, 0); // 防止数组越界for (int i = 0; i < n; ++i){cin >> v[i];}for(int i = 1; i <= n; ++i) // n是判断最后一个元素单独为一个序列的情况{if(i == n - 1) // 数组不多开一个空间且 i != n的话就这样写{++cnt;break;}if(v[i] > v[i - 1]){while(i < n && v[i] >= v[i - 1]){++i;}++cnt;}else if(v[i] < v[i - 1]) // 注意不能直接写成if{while(i < n && v[i] <= v[i - 1]){++i;}++cnt;}else{while(i < n && v[i] == v[i - 1]){++i;}}}cout << cnt;return 0;
}

Java代码

import java.util.*;
public class Solution
{public int LIS (int[] a) {int n = a.length;int[] dp = new int[n + 1]; // dp[i] 表⽰⻓度为 i 的最⼩末尾int pos = 0;for(int x : a){// 找 x 应该放在哪⾥if(pos == 0 || x > dp[pos]){dp[++pos] = x;}else{// ⼆分查找插⼊位置int l = 1, r = pos;while(l < r){int mid = (l + r) / 2;if(dp[mid] >= x)r = mid;elsel = mid + 1;}dp[l] = x;}}return pos;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用uniapp + Vue3 + uni.createInnerAudioContext()实现播放歌曲及歌词滚动、拖动进度条

一、大致效果 二、使用步骤 1.歌词详情页代码块 <template><view class"play"><view class"play_centent" :style"{ background-image: url( playInfo.siPic ) }"><div class"cover-mask" style"opacit…

无人机维护保养、部件修理更换技术详解

无人机作为一种精密的航空设备&#xff0c;其维护保养和部件修理更换是确保飞行安全、延长使用寿命的重要环节。以下是对无人机维护保养、部件修理更换技术的详细解析&#xff1a; 一、无人机维护保养技术 1. 基础构造理解&#xff1a; 熟悉无人机的基本构造&#xff0c;包括…

解决Redis缓存穿透(缓存空对象、布隆过滤器)

文章目录 背景代码实现前置实体类常量类工具类结果返回类控制层 缓存空对象布隆过滤器结合两种方法 背景 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库 常见的解决方案有两种&#xff0c;分别…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

【STM32】GPIO通用输入输出口

文章目录 一、GPIO的概念二、STM32中GPIO的基本结构三、GPIO位结构输入部分分析输出部分分析GPIO的8种模式 四、GPIO相关函数 一、GPIO的概念 GPIO&#xff08;General Purpose Input Output&#xff09;&#xff0c;意为通用输入输出口&#xff0c;在嵌入式系统中&#xff0c;…

stm32疑难杂症之电压不够程序跑飞

在开发阶段&#xff0c;如果出现程序不断重启的情况。 首先先检查是不是代码问题。 1.数组越界。定义的数组只有50个单元&#xff0c;但是程序运行的过程中&#xff0c;却给他赋给50个单元。 2.中断耗时太长&#xff0c;刚出中断又进去了。这时的现象是程序一直在中断中执行…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

电子电气架构 --- 整车控制系统

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

STM32 HAL库 SPI驱动1.3寸 OLED屏幕

目录 参考硬件引脚与接线 点亮屏幕CubeMX 配置OLED 驱动程序代码 参考 基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏&#xff08;0.96寸 1.3寸通用&#xff09;0.96 oled HAL库驱动 SPI STM32SPI驱动0.96/1.3寸 OLED屏幕&#xff0c;易修改为DMA控制STM32驱…

iOS 18.2 可让欧盟用户删除App Store、Safari、信息、相机和照片应用

升级到 iOS 18.2 之后&#xff0c;欧盟的 iPhone 用户可以完全删除一些核心应用程序&#xff0c;包括 App Store、Safari、信息、相机和 Photos 。苹果在 8 月份表示&#xff0c;计划对其在欧盟的数字市场法案合规性进行更多修改&#xff0c;其中一项更新包括欧盟用户删除系统应…

力扣11.2

2742. 给墙壁刷油漆 给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time &#xff0c;分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠&#xff1a; 一位需要 付费 的油漆匠&#xff0c;刷第 i 堵墙需要花费 time[i] 单位的时间&#xff0c;开销为 cost…

[前端] 为网站侧边栏添加搜索引擎模块

前言 最近想给我的个人网站侧边栏添加一个搜索引擎模块&#xff0c;可以引导用户帮助本站SEO优化&#xff08;让用户可以通过点击搜索按钮完成一次对本人网站的搜索&#xff0c;从而实现对网站的搜索引擎优化&#xff09;。 最开始&#xff0c;我只是想实现一个简单的百度搜索…

nodejs入门教程20:nodejs文件系统

1. 引入fs模块 在Node.js中&#xff0c;你可以通过以下方式引入fs模块&#xff1a; const fs require(fs);2. 文件操作 读取文件 异步读取&#xff1a;使用fs.readFile()方法。该方法接收文件路径和回调函数作为参数&#xff0c;回调函数在文件读取完成后被调用。 fs.rea…

使用AWS Redshift从AWS MSK中读取数据

Amazon Redshift 流式摄取的目的是简化将流式数据直接从流式服务摄取到 Amazon Redshift 或 Amazon Redshift Serverless 的过程。 官方文档[1]中有详细步骤。用unauthenticated, IAM 的方式均可以进行连接&#xff0c;只不过使用的是不同端口&#xff1a;9092或者9098 [1] h…

2-3-4树的层序打印

234树 接前面0到100与B树比较0到50镜像代码更新随机测试后话接前面 红黑树转2-3-4树打印失败的地方。 0到100 这个是应该的样子 >>> rb = RBT() >>> for k in range(100):rb.INSERT(k) >>> t=tree234(rb.root) >>> t.print() 结点类型…

了解AIGC——文本生成技术在新闻媒体中的应用

了解AIGC&#xff1a;文本生成技术在新闻媒体中的应用 引言 生成式人工智能内容&#xff08;AI-Generated Content&#xff0c;简称AIGC&#xff09;在新闻媒体中的应用已经成为技术革新和内容创作的主要方向之一。新闻行业长期依赖于人类记者和编辑的创造力&#xff0c;而AI…

UBUNTU查看CPU核心数

UBUNTU查看CPU核心数 前言一、使用lscpu命令1. 执行命令2. 查看输出 二、使用/proc/cpuinfo文件1. 查看文件2. 解释输出 三、使用nproc命令1. 执行命令2. 查看输出 四、使用htop或top工具1. 使用htop2. 使用top 五、使用inxi命令1. 执行命令2. 查看输出 六、使用图形界面工具1.…

机器学习线性回归

文章目录 1.基本概念2.最小二乘法3.用代码来表示线性回归 1.基本概念 线性回归是一种统计方法&#xff0c;用于分析两个或多个变量之间的关系。其主要目的是通过建立一个线性模型来预测一个因变量&#xff08;或称为目标变量&#xff09;与一个或多个自变量&#xff08;或称为…

基于Openwrt系统架构,实现应用与驱动的实例。

一、在openwrt系统架构&#xff0c;编写helloworld的应用程序。 第一步先创建目录&#xff0c;项目代码要放在 openwrt根目下的 package 目录中&#xff0c;这里源码写在了 hellworld 的 src 目录下&#xff0c;因为外层还有需要编写的文件。 mkdir -p ~/openwrt/package/hel…

C++ STL 学习指南:带你快速掌握标准模板库

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 大家好呀&#xff01;&#x1f917; 今天我们来聊一聊 C 程序员的必备神器——STL&#xff08;Standard Template Library&#xf…