【C++】 —— 笔试刷题day_29

news2025/5/19 7:33:50

一、排序子序列

题目解析

在这里插入图片描述

一个数组的连续子序列,如果这个子序列是非递增或者非递减的;这个连续的子序列就是排序子序列。

现在给定一个数组,然后然我们判断这个子序列可以划分成多少个排序子序列。

例如:1 2 3 2 2 1 可以划分成 1 2 32 2 1两个排序子序列

算法思路

对于这道题,思路就很简单了:

暴力解法

0位置开始遍历,寻找一段连续子序列,直到这一段子序列不满足排序子序列的条件,即找到了一个排序子序列;

然后继续从上次遍历结束位置接着遍历数组,寻找下一个子序列。

贪心优化:

当我们遍历到数组中数值相同的区域时,我们要知道,要找的子序列是非递增或者非递减的;

所以这一段相等的序列,我们可以加到前面或者后面的任意序列中。

所以我们在遇到数值相等的子序列时,继续向后遍历即可。

但是这样我们会发现两个问题:

  1. 如果数组刚开始位置的数据是相等的,我们不知道这段子序列是非递增的还是非递减的;
  2. 我们在遍历过程中会用到下一个位置的值来判断是非递增还是非递减,那最后一个位置该怎么办?

对于数组开头的相等子序列,我们可以直接跳过,因为这一段相等的序列可以加到后面的子序列中;

而对于最后一个位置,如果它不能和前面序列组成一个排序子序列,那就只能让它自己组成一个排序子序列了。

在这里插入图片描述

代码实现

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int arr[N];
int n;
int main() {
    cin >> n;
    for (int i = 0; i < n; i++)  cin >> arr[i];
    int ret = 0;
    for (int i = 0; i < n; i++) {
        if (i == n - 1) { //数组最后一个位置
            ret++;
            break;
        }
        if (arr[i] < arr[i + 1]) {//非递增
            while (i < n && arr[i] <= arr[i + 1])
                i++;
            ret++;
        } else if (arr[i] > arr[i + 1]) {//非递减
            while (i < n && arr[i] >= arr[i + 1])
                i++;
            ret++;
        } else {//数组开始位置的相等子序列
            while (i < n && arr[i] == arr[i + 1])
                i++;
        }
    }
    cout << ret << endl;
    return 0;
}

二、消减整数

题目解析

在这里插入图片描述

这道题给定一个正整数H,然后从1开始减,第一次减去1,之后每一次减去的数要么和上一次相等,要么是上一次的两倍;

简单来说就是:h每次减去一个数,x起始是1;之后每一h减去x或者2*xx表示上次减去的数)。

现在,最少需要几次才能将h减到0

算法思路

对于这道题,暴力解法

h每次减去x或者2*x,让它一值减,直到h减到0或者<0

简单来说就是分情况讨论:第一次减去1,之后分别考虑减去x和减去2*x的情况。

这样时间复杂度和空间复杂度都太大了;并且h每一次减也不一定会恰好等于0

贪心优化:

这道题要我们求的是将x减到0的最少次数;

那如果我们的h减去某一个数是无法减到0的,那我们就不用去考虑它了;

所以,我们现在要考虑的是,h减的过程中,减去x能否减到0;减去2*x能否减到0

这个也非常容易判断了,如果hx的整数倍,那减去x就肯定可以减到0;如果h2*x的整数倍,那减去2*x就也能减到0

现在有一个问题,如果h既是x的倍数,也是2*x的倍数, 那是减去x还是2*x呢?

很显然是减去2*X,因为我们要求的是h减到0的最小次数,那可以是减去大的数次数更小啊。

所以我们整体思路就出来了,在减的过程中,判断h2*x的倍数,如果是就减去2*x;如果不是就减去x

在这里插入图片描述

代码实现

#include <iostream>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        n--;//第一次减去1
        int ret = 1,x = 1;
        while(n)
        {
            if(n % (2*x) == 0)
                x*=2;
            n-=x;
            ret++;
        }
        cout<<ret<<endl;
    }
    return 0;
}

三、最长上升子序列(二)

题目解析

在这里插入图片描述

对于这道题,给定一个数组,然后我们要找到这个数组中最长严格上升子序列的长度;

严格上升子序列:一个数组删掉其中一些数(可以不删)之后,形成的新数组它是严格上升(非递减)的。

简单来说就是:一个数组的子序列,这个子序列是严格上升的。

现在我们要找到所有上升子序列中长度最长的子序列;然后返回它的长度。

算法思路

对于这道题,一眼看起,可以说毫无思路;这该如何去找啊?

细细看来:

我们要找所有严格上升的子序列,当我们遍历到某一个位置时,我们要知道这个位置的数据和前面位置的数据是否能够形成严格上升的子序列;所以我们就要知道这个位置前面有多少个严格上升的子序列,这个位置的数据能放到哪些子序列当中去?

所以我们就要记录:当前所有的严格上升子序列,以及子序列中的元素。

那我们如何去记录所有的严格上升子序列呢?

当遍历到一个位置时:

这个位置如果是大于等于前面所有位置的,那我们可以把这个位置的元素放到任意一个子序列的后面形成一个新的子序列;

但是,我们没有必要去把这个元素放到每一个子序列的后面形成新的子序列。

加入前面有子序列11,21,2,4,当前位置数据是7,我们可以形成1,71,2,71,2,4,7三个新的子序列;但是我们可以发现长度为2的子序列有两个1,21,7,我们有必要把这两个长度一样的子序列都记录下来吗?

很显然是不需要的,我们只需要记录长度为n的子序列它最后一个元素最小的子序列即可

所以,我们只需要按长度n1,2,3...n)记录子序列即可。

那问题又来了,我们要记录子序列中的所有元素吗?

比如11,21,2,41,2,4,7,我们要记录子序列中的所有元素吗?

当然也是没有必要的;当我们遍历一个位置时,我们只需要判断这个位置的能否和前面的子序列组成新的子序列;我们不需要关心这个子序列是什么,所以我们只需要保存子序列最后一个位置的元素即可。

那现在还有一个问题:遍历一个位置时,它可以与前面子序列形成新的子序列,但是长度不是最大的怎么办?

简答来说:现在有子序列11,21,2,41,2,4,7四个子序列,现在遍历到某一个位置,这个位置的值是3

它可以和1形成1,3但是最后一个元素是3是大于1,2的最后一个元素2的,我们可以不用考虑。

它可以和1,2形成1,2,3,它最后一个元素3是小于1,2,4最后一个元素4的,我们就要修改长度为3的子序列,将4修改成3

OK啊,现在大致明白了这道题如何去解决;

但是我们要遍历一遍数组,而且还要去判断一个某一个位置是否能和前面子序列形成新的子序列,形成新的子序列是否比之前的子序列更好;那就要存放每一个长度的子序列对应的最后一个元素的值;时间复杂度那不就是O(n^2)了,题目明确要求时间复杂度是O(n log N)啊。

二分查找

所以这里我们要使用二分算法去优化查找。

当我们遍历到一个位置时,当这个位置的值是>=dp[pos](大于长度最大的子序列的最后一个位置),它可以和长度最大的子序列形成一个新的子序列,长度就是pos+1,直接新增一个位置即可(dp[pos+1] = x)。

但是如果这个位置的值是小于长度最大的子序列的最后一个位置,它可能可以和前面的某一个子序列形成新的子序列,而形成新的子序列的最后一个位置的值,一定是小于等于之前该长度的子序列最后一个位置的值的。

所以我们就要找到这个子序列;

我们按暴力查找它的时间复杂度是O(n);但是我们仔细思考可以发现,我们存放的是长度为n的子序列的最后一个位置的值,那这个数组dp是不是就是非递减的了?

所以我们就可以使用二分查找来搜索这个子序列,而我们要找的也就是>=当前位置的值的区间左端点。

在这里插入图片描述

代码实现

class Solution {
  public:
    int dp[100001];
    int pos = 0;
    int LIS(vector<int>& a) {
        for (auto& e : a) {
            if (pos == 0 || e >= dp[pos])
                dp[++pos] = e;
            else {
                int l = 1, r = pos;
                while (l < r) {
                    int mid = l + (r - l) / 2;
                    if (dp[mid] >= e)
                        r = mid;
                    else
                        l = mid + 1;
                }
                dp[l] = e;
            }
        }
        return pos;
    }
};

到这里,本篇文章内容就结束了。
继续加油啊!!!

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

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

相关文章

MongoTemplate 基础使用帮助手册

前言 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件&#xff0c;它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作&#xff0c;使开发者能够轻松执行 CRUD 操…

图像处理:预览并绘制图像细节

前言 因为最近在搞毕业论文的事情&#xff0c;要做出一下图像细节对比图&#xff0c;所以我这里写了两个脚本&#xff0c;一个用于框选并同时预览图像放大细节&#xff0c;可显示并返回框选图像的坐标&#xff0c;另外一个是输入框选图像的坐标并将放大的细节放置在图像中&…

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列&#xff0c;使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法&#xff0c;可以高效地解决该问题。具体步骤为&#xff1a;初始化一个结果列表&#xff0c;遍历 words 数组&#xff0c;检查当前字符串的…

ssti刷刷刷

[NewStarCTF 公开赛赛道]BabySSTI_One 测试发现过滤关键字&#xff0c;但是特殊符号中括号、双引号、点都能用 可以考虑拼接或者编码&#xff0c;这里使用拼接 ?name{{()["__cla"~"ss__"]}}?name{{()["__cla"~"ss__"]["__ba&…

java+selenum专题(一)

环境搭建部署篇-> 1.简介 java版的selenium&#xff0c;介绍一下java selenium自动化测试。大致和pythonselenium自动化测试差不多。基于java和selenium做自动化测试&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)

[逆向工程]DebugView捕获WPS日志&#xff1f;解析未运行WPS时Shell扩展加载的原因与解决方案&#xff08;二十五&#xff09; 引言&#xff1a;一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时&#xff0c;发现日志中频繁出现 WPS 相关模块&#xff08;如 k…

ACM模式用Scanner和System.out超时的解决方案和原理

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;笔试强训 &#x1f4da;本系列文章为个人学…

Java注解详解:从入门到实战应用篇

1. 引言 Java注解&#xff08;Annotation&#xff09;是JDK 5.0引入的一种元数据机制&#xff0c;用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战&#xff0c;全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…

自学嵌入式 day19-数据结构 链表

二、线性表的链式存储 1.特点&#xff1a; &#xff08;1&#xff09;线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占用的位置上。 &#xff08;2&#xff09;所以…

东芝第3代SiC MOSFET助于降低应用中电源损耗

功率器件是管理和降低各种电子设备电能功耗以及实现碳中和社会的重要元器件。由于与比硅材料相比&#xff0c;碳化硅具有更高的电压和更低的损耗&#xff0c;因此碳化硅&#xff08;SiC&#xff09;被广泛视为下一代功率器件的材料。虽然碳化硅功率器件目前主要用于列车逆变器&…

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…

官方 Elasticsearch SQL NLPChina Elasticsearch SQL

官方的可以在kibana 控制台上进行查询&#xff1a; POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询&#xff0c;但是可以使用postman接口进行查询&#xff1a;

5月16日复盘-目标检测开端

5月16日复盘 一、图像处理之目标检测 1. 目标检测认知 ​ Object Detection&#xff0c;是指在给定的图像或视频中检测出目标物体在图像中的位置和大小,并进行分类或识别等相关任务。 ​ 目标检测将目标的分割和识别合二为一。 ​ What、Where 2. 使用场景 目标检测用于…

mathematics-2024《Graph Convolutional Network for Image Restoration: A Survey》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

IDEA怎么汉化idea中文改回英文版

第一步:点击左上角的File&#xff0c;然后选择Setting 第二步&#xff1a;Setting页面选择 Appearance & Behavior&#xff0c;然后展开System Settings&#xff0c;然后选择 Language and Region&#xff0c;进行修改 我操作的是2024年的版本 File->Settings -> Ap…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

从技术视角解构 Solana Meme 币生态

在高吞吐、高并发的 Solana 网络上&#xff0c;一类轻量化、高热度的代币形式正在爆发式增长——Meme Token&#xff08;迷因代币&#xff09;。尽管起源于社群文化&#xff0c;但其技术实现并非“玩笑”&#xff0c;而是一整套构建于 Solana Runtime 与 Token Extensions 之上…

智能接处警系统:以秒级联动响应重塑应急处置效能

​​随着我国能源、化工、航空等关键行业的快速发展&#xff0c;传统消防管理模式已难以满足高效应急响应的需求。国家能源局、应急管理部、民航总局均出台专项规定&#xff0c;对消防站建设提出更高要求&#xff0c;在此背景下&#xff0c;智能接处警系统正是应对这些挑战的核…