【C++】求第二大的数详细解析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
  • 💯输入描述
  • 💯解题思路分析
    • 1. 题目核心要求
    • 2. 代码实现与解析
    • 3. 核心逻辑逐步解析
      • 定义并初始化变量
      • 遍历并处理输入数据
      • 更新最大值与次大值
      • 输出结果
    • 4. 示例分析
      • 示例输入
      • 示例输出
      • 数据处理过程
  • 💯高级拓展与优化分析
    • 时间与空间复杂度
    • 潜在错误与改进方向
    • 数学与工程意义
  • 💯多种解法的对比与讨论
    • 排序法
    • 分治法
  • 💯小结


在这里插入图片描述


💯前言

  • 计算机科学和算法设计领域,如何以最优的方式处理有限的资源和数据一直是一个重要的研究课题。针对这一问题,本次探讨围绕一个经典的编程挑战展开:寻找数列中的次大值。本题虽然在描述上简洁,但通过限制变量和数据结构的使用,从而将重点放在动态维护状态变量优化算法性能上。这不仅为基础算法设计提供了宝贵的训练机会,同时也为解决实际工程中的资源约束问题提供了可借鉴的思路。
    本次分析将从题目背景算法设计代码实现扩展优化多解法对比等多个角度,系统地探讨这一问题的本质及其实现方法。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

在这里插入图片描述
数学里有一个函数定义为 max(a, b),它返回 a 和 b 中较大的那个值。基于这一定义,现要求完成一个函数 max2,旨在从当前已经处理过的所有输入数字中,返回次大值。

需要注意的是,本题对代码实现有如下明确限制:

  • 只能使用两个全局变量 a1a2 分别记录当前最大值和次大值。
  • 不允许使用数组或其他结构存储所有输入的数字。
  • 允许额外使用两个局部变量用于存储整数个数 n 和当前输入的整数。

💯输入描述

在这里插入图片描述
第一行输入一个整数 n,表示有 n 个正整数满足 2 ≤ n ≤ 100 2 \leq n \leq 100 2n100

第二行输入 n 个互不相等的正整数。

输出描述
输出仅包含一个整数,即输入数列中的次大值。

示例1
输入:

10
10 9 8 7 6 5 4 3 2 1

输出:

9

💯解题思路分析

在这里插入图片描述


1. 题目核心要求

在这里插入图片描述
本题的核心在于从输入数据中以高效方式求解次大值,同时遵守以下条件约束:

  • 输入正整数各不相同,保证了最大值和次大值的存在性。
  • 只能使用两个变量 a1a2 存储结果状态,考验算法设计对空间资源的优化。
  • 需要保证算法能够在线性时间内完成计算,即时间复杂度为 O ( n ) O(n) O(n)

2. 代码实现与解析

以下是问题的完整代码实现:

#include <iostream>
using namespace std;
#include <climits>void max2() {int n;cin >> n; // 读取正整数个数int a1 = INT_MIN; // 最大值初始化为最小整数int a2 = INT_MIN; // 次大值初始化为最小整数for (int i = 0; i < n; ++i) {int num;cin >> num; // 逐一读取每个正整数if (num > a1) {// 当前数字比最大值大,则更新最大值和次大值a2 = a1;a1 = num;} else if (num > a2) {// 当前数字介于最大值和次大值之间,更新次大值a2 = num;}}cout << a2 << endl; // 输出次大值
}int main() {max2();return 0;
}

在这里插入图片描述


3. 核心逻辑逐步解析

在这里插入图片描述


定义并初始化变量

在这里插入图片描述

int a1 = INT_MIN;
int a2 = INT_MIN;
  • 目的
    • a1 用于记录当前的最大值。
    • a2 用于记录当前的次大值。
    • 初始化为 INT_MIN,以确保任何正整数输入都可以覆盖初始值。

遍历并处理输入数据

在这里插入图片描述

for (int i = 0; i < n; ++i) {int num;cin >> num;
  • 使用 for 循环逐一读取正整数,并对每个输入值进行处理。
  • 每次读取到的新数字需要根据与 a1a2 的关系进行条件判断。

更新最大值与次大值

在这里插入图片描述

if (num > a1) {a2 = a1;a1 = num;
} else if (num > a2) {a2 = num;
}
  • 逻辑分析
    1. num > a1 时:
      • 原最大值 a1 退化为次大值 a2
      • 新数字 num 成为新的最大值 a1
    2. num 位于最大值 a1 和次大值 a2 之间时:
      • 更新 a2 为当前数字 num

输出结果

在这里插入图片描述

cout << a2 << endl;
  • 循环结束后,a2 中存储的是次大值,直接输出。

4. 示例分析

在这里插入图片描述


示例输入

在这里插入图片描述

10
10 9 8 7 6 5 4 3 2 1

示例输出

在这里插入图片描述

9

数据处理过程

在这里插入图片描述

迭代次数当前数字 (num)最大值 (a1)次大值 (a2)
11010INT_MIN
29109
38109
101109

最终结果:次大值为 9。


💯高级拓展与优化分析

在这里插入图片描述


时间与空间复杂度

在这里插入图片描述

  • 时间复杂度
    • 对输入数据的单次遍历,复杂度为 O ( n ) O(n) O(n),与数据规模呈线性关系。
  • 空间复杂度
    • 仅使用两个额外变量 a1a2,复杂度为 O ( 1 ) O(1) O(1)

潜在错误与改进方向

在这里插入图片描述

  1. 初始化问题

    • 如果未正确初始化 a1a2,例如初始化为 0,在输入为负数时会导致错误。
    • 为避免此类问题,需始终选择合适的初始值,例如 INT_MIN
  2. 边界条件处理

    • 当 ( n = 2 ) 时,代码需要保证能够正确处理这类极小输入规模的场景。
  3. 逻辑健壮性

    • 对于更复杂的输入场景(如输入中存在重复值或非法值),需增加必要的输入校验逻辑。

数学与工程意义

在这里插入图片描述
从数学角度来看,本题的核心问题是动态维护“前两大值”。这类问题在实际工程中有广泛应用,例如:

  • 流式数据处理:实时更新数据流的统计特性。
  • 排名问题:动态维护某指标的前 k 个最大值。

在资源受限的场景下(如嵌入式设备或内存有限的系统),设计类似的轻量级算法尤为重要。


💯多种解法的对比与讨论

在这里插入图片描述

排序法

  • 思路:对输入数据排序,取倒数第二个值。
  • 时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)
  • 缺点:额外的空间和时间开销。
    在这里插入图片描述

分治法

  • 思路:递归分组寻找最大值和次大值。
  • 时间复杂度:接近 O ( n ) O(n) O(n)
  • 缺点:代码复杂度较高,且在小规模数据上优势不明显。
    在这里插入图片描述

💯小结

  • 在这里插入图片描述
    通过本题,我们可以清晰认识到在有限资源条件下,如何设计高效算法以满足问题需求。这不仅考察了程序的正确性,还着重强调了代码的优化能力和设计美感。
    这种能力的培养需要长期的练习和理论积累,同时在不同场景中总结经验。更重要的是,这类问题的解决思路能够拓展到更广泛的工程实践中,例如实时数据分析、大规模流数据处理等领域,为构建更高效的系统打下坚实基础。

在这里插入图片描述


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

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

相关文章

redis-stack redisSearch环境安装搭建

RedisSearch在redis许可证变更之后显得是redis中的一大特色&#xff0c;闲来无事学习记录一下。 尝试通过源码编译redisSearch&#xff0c;貌似非常费劲&#xff0c;所以建议使用docker或者Linux的发行包进行安装redis-stack。redis-stack是基于redis的模块化机制进行一个扩展…

JavaCV录屏到网络流

1、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

scala 编写 hdfs 工具类

scala 编写 hdfs 工具类 scala 创建 删除 hdfs 文件或目录 scala 上传 下载 hdfs 文件 scala 读取 写入 hdfs 文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&quo…

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…

Cesium 按区域生成高度图

Cesium 按区域生成高度图 Cesium 按区域生成高度图 const cmd new CustomDrawCommand({vertexArray,shaderProgram,commandType: Compute,outputTexture: bufferColor,uniformMap,postExecute: () > {const url getImageByTexture(bufferAColor, gl);viewer.scene.primiti…

RESTful API设计原则与最佳实践

在当今的数字化时代&#xff0c;应用程序编程接口&#xff08;API&#xff09;已成为企业间数据交换、系统集成和业务扩展的关键工具。RESTful API作为一种基于HTTP协议的轻量级、无状态、可扩展的架构设计风格&#xff0c;在Web服务、移动应用、物联网等多个领域得到了广泛应用…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

最小绝对偏差(Least Absolute Deviation, LAD)---子梯度法

最小绝对偏差&#xff08;Least Absolute Deviations&#xff0c;简称LAD&#xff09;是一种用于回归分析的统计方法&#xff0c;其目标是最小化残差的绝对值之和&#xff0c;而不是最小二乘法中的残差平方和。LAD回归特别适用于存在异常值的数据集&#xff0c;因为它对异常值不…

Linux - 进程等待和进程替换

进程等待 前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源. waitpid 我们可以通过 Linux 提供的系统调用函数 wait 系列函数来等待子进程死亡, 并回收资源. #include <sys/t…

mac下载安装jdk

背景 长时间不折腾mac全部忘记 特此记录 安装 1.下载jdk 根据需要下载对应的jdk 我直接 下载到/Applicatiions目录 https://www.oracle.com/java/technologies/downloads/#java8-mac 2.解压 cd /Applicatiions tar -zxvf jdk-8u431-macosx-x64.tar.gz 3.配置环境 …

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…

1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)

一、mysql2 概述 mysql2 是一个用于 Node.js 的 MySQL 客户端库 mysql2 是 mysql 库的一个改进版本&#xff0c;提供了更好的性能和更多的功能 使用 mysql2 之前&#xff0c;需要先安装它 npm install mysql2 二、mysql2 初识案例 1、数据库准备 创建数据库 testdb CREAT…

[HDCTF 2023]LoginMaster

[HDCTF 2023]LoginMaster 知识点 quine注入 解题 用户名要为admin 查看robots.txt&#xff0c;查看源码 password是注入点 function checkSql($s) {if(preg_match("/regexp|between|in|flag||>|<|and|\||right|left|reverse|update|extractvalue|floor|subs…

springboot398研究生调研管理系统(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

OSCP - Proving Grounds - Zino

主要知识点 SMB知识python脚本提权 具体步骤 执行nmap Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-10 01:24 UTC Nmap scan report for 192.168.52.64 Host is up (0.00077s latency). Not shown: 65529 filtered tcp ports (no-response) PORT STATE SER…

JDK8新特性之Stream流03

收集Stream流中的结果 IntStream intStream = Stream.of(1, 2, 3, 4, 5).mapToInt(Integer::intValue); intStream.filter(n -> n > 3).forEach(System.out::println); intStream.filter(n -> n > 3).count; intStream.filter(n -> n > 3).reduce(0, Integer…

自制shell命令行解释器,深入理解Linux系统命令行实现原理

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 ​编辑 1.打印命令提示符 ​编辑 2.获取用户输入指令 3.重定向分析 4.命令行参数表与环境变量表 5.命令解析 6.命令执行 6.1.创建子进程 6.2.文件…

ADB常用各模块操作命令

目录 1. 基本设备信息获取 2. 设备连接与管理 3. 文件管理 4. 进程与应用管理 5. 日志与调试 6. 调试和性能 7. 设备操作 8.adb命令的应用场景 1. 基本设备信息获取 获取设备的系统版本&#xff0c;获取设备安卓版本号&#xff1a; adb shell getprop ro.build.version.…

Mac M1 安装数据库

1. Docker下载 由于Sqlserver和达梦等数据库&#xff0c;不支持M系列的芯片&#xff0c;所以我们通过docker安装 下载并安装docker: https://www.docker.com/get-started/ 安装完成后&#xff0c;打开docker 2. SQL Server 安装 2.1 安装 打开终端&#xff0c;执行命令 doc…

渗透测试实验环境搭建

下载虚拟机镜像 5个虚拟机镜像&#xff0c;其中Linux攻击机我选择用最新的kali Linux镜像&#xff0c;其余的均使用本书配套的镜像。 网络环境配置 VMware虚拟网络编辑器配置&#xff1a; 将VMnet1和VMnet8分别设置IP为192.168.10.0/24和10.10.10.0/24。 虚拟机镜像配置 攻击机…