【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,一经查实,立即删除!

相关文章

从零用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…

SpringMVC全局异常处理

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

Linux - 进程等待和进程替换

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

【Java】—— 图书管理系统

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

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.文件…

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。 虚拟机镜像配置 攻击机…

C# 中 Interface(接口)和 virtual(虚方法)

文章目录 前言一、Interface&#xff08;接口&#xff09;1. 什么是接口2. 接口的定义3. 实现接口4. 接口的作用 二、virtual&#xff08;虚方法&#xff09;1. 什么是虚方法2. 虚方法的定义3. 重写虚方法4. 虚方法的作用 三、Interface 和 virtual 的结合使用1. 接口中的虚方法…

阿里云ECS服务器域名解析

阿里云ECS服务器域名解析&#xff0c;以前添加两条A记录类型&#xff0c;主机记录分别为www和&#xff0c;这2条记录都解析到服务器IP地址。 1.进入阿里云域名控制台&#xff0c;找到域名 ->“解析设置”->“添加记录” 2.添加一条记录类型为A,主机记录为www&#xff0c…

网络知识:IP数据报知识详解

目录 一、IP数据报概念 二、IPV4数据报报头组成 三、IPV6数据报报头组成 今天给大家分享IP数据库相关的知识,希望对大家进一步了解IP协议提供一些帮助! 一、IP数据报概念 TCP/IP协议的网际层接收到传输层传递过来的数据单元,封装成向下(OSI模型的数据链路层、TCP/IP协…

蓝桥杯刷题日记02-小球反弹

问题描述 有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰…

SWIRL:有望成为2025年顶级AI搜索引擎

现在几乎每家公司都会有内部文档系统&#xff0c;如阿里的语雀、钉钉&#xff0c;字节的飞书&#xff0c;Confluence&#xff0c;印象笔记等等都可以提供给B端在局域网部署。因此&#xff0c;如果能把搜索功能做得高效&#xff0c;就能提高自家产品的竞争力。 想象一下&#xf…

2024 数学建模国一经验分享

2024 数学建模国一经验分享 背景&#xff1a;武汉某211&#xff0c;专业&#xff1a;计算机科学 心血来潮&#xff0c;就从学习和组队两个方面指点下后来者&#xff0c;帮新人避坑吧 2024年我在数学建模比赛中获得了国一&#xff08;教练说论文的分数是湖北省B组第一&#xff0…

Centos7环境下nifi单机部署

Centos7环境下nifi单机部署 前言一、安装Nifi1.1 下载并解压1.2 修改配置文件 二、启动Nifi程序三、Nifi的简单使用3.1 文件移动3.2 本地文件传到HDFS 参考博客 前言 本以为在服务器上部署nifi很简单&#xff0c;跟着教程走就好&#xff0c;但是并没有成功&#xff0c;可能是因…

c++的应用

整理思维导图周五剩下的三个笔试题利用函数重载&#xff0c;实现对整形数组的冒泡排序&#xff0c;对浮点型数组的冒泡排序整理课上内容在堆区申请一个数组的空间&#xff0c;并完成对该数组中数据的输入和输出&#xff0c;程序结束释放堆区空间 冒泡排序效果图&#xff1a; 代…

【仪器仪表】怎么模拟电池短路、正极开路或负极开路

最近新人需要做一个电池充放电工装的测试验证板。这种验证板需要模拟很多状态,比如电池有可能发生短路、电池的正极开路、电池负极开路、电池内阻上升、电池电压过高、电池电压过低、电池反接等等。 在规划电池短路、正极开路或负极开路的电路时,本来想用一个继电器做线路的开…