当前位置: 首页 > news >正文

【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)
  • 缺点:代码复杂度较高,且在小规模数据上优势不明显。
    在这里插入图片描述

💯小结

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

在这里插入图片描述


相关文章:

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

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;输入描述&#x1f4af;解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…...

从零开始学TiDB(3)TiKV 持久化机制

如图&#xff0c;每个TiKV有两个rocksdb实例&#xff0c;rocksdbKV复制存储键值对&#xff0c;rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似&#xff0c;在OB中每个Unit及其副本构成了paxos组&#xff0c;在TiDB中叫raft…...

Elasticsearch+Kibana+IK分词器+拼音分词器安装

目录 ES报错 Kibanaik分词器拼音分词器 安装都比较简单&#xff0c;可以参考这几篇博客 ES 如何在 Linux&#xff0c;MacOS 及 Windows 上进行安装 Elasticsearch 报错 ES启动报错error downloading geoip database [GeoLite2-ASN.mmdb] Kibana KIBANA的安装教程&#xff…...

子网划分实例

看到有人问这个问题&#xff1a; 想了一下&#xff0c;这是一个子网划分的问题&#xff1a; 处理方法如图&#xff1a; 这是一个子网划分的问题 设备1用三层交换机&#xff0c;端口设置为路由模式&#xff0c;设备2和设备3为傻瓜交换机模式 设备2和设备3下挂设备都是26为掩码&…...

上海亚商投顾:创业板指震荡调整 机器人概念股再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;深成指、创业板指盘中跌超1%&#xff0c;尾盘跌幅有所收窄。机器人概念股逆势爆…...

【C++ 20进阶(2):初始化 Initializer

【C 20进阶&#xff08;2&#xff09;&#xff1a;初始化 Initializer】 原文&#xff1a;https://blog.csdn.net/weixin_44259356/article/details/144377955 引言 本篇文章为系列文章将着重介绍C20新特性&#xff0c;一是希望可以和大家交流分享&#xff0c;二是也便于自己…...

【重生之我在B站学MySQL】

MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…...

Python实现中国象棋

探索中国象棋 Python 代码实现&#xff1a;从规则逻辑到游戏呈现 中国象棋&#xff0c;这款源远流长的棋类游戏&#xff0c;承载着深厚的文化底蕴与策略智慧。如今&#xff0c;借助 Python 与 Pygame 库&#xff0c;我们能够在数字世界中复刻其魅力&#xff0c;深入探究代码背后…...

LBS 开发微课堂|通过openGL ES轻松实现建筑物渲染及动画

为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第五期的主题是 通过openGL ES轻松实现 建筑物渲染及动画 对于…...

map1[item.id]和map1.get(item.id)的区别为何前者取出的是空,后者取出的是正确的值

在 JavaScript 中&#xff0c;map1[item.id] 和 map1.get(item.id) 用于从 Map 对象中获取值&#xff0c;但它们的工作方式有所不同&#xff1a; map1[item.id]&#xff1a;这种方式用于普通对象&#xff08;Object&#xff09;&#xff0c;它将 item.id 作为键来获取对应的值…...

window端sqlplus连接linux_oracle11g

1. 环境配置回顾 下载 Oracle Instant Client&#xff1a;根据查询到的版本到链接: oracle官网下载对应版本的三个文件&#xff08;比如我这里查询到的版本是12.2.0.1.0&#xff09;&#xff1a; instantclient-basic-windows.x64-12.2.0.1.0.zip instantclient-sqlplus-win…...

Go支付中台方案:多平台兼容与多项目对接

一、中台的概念 中台是一种企业级的架构模式&#xff0c;它处于前台应用和后台资源之间&#xff0c;将企业核心能力进行整合、封装&#xff0c;形成一系列可复用的业务能力组件。这些组件就像乐高积木一样&#xff0c;可以被不同的前台业务快速调用&#xff0c;从而避免重复开…...

MySQL触发器的使用详解

MySQL触发器的使用详解 MySQL触发器是一种特殊的存储过程&#xff0c;它与表操作紧密相关&#xff0c;并且在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事…...

关于NLP交互式系统的一些基础入门

【1】What 基于自然语言处理&#xff08;NLP&#xff09;的交互式系统是指能够理解、解析并生成人类自然语言的计算机程序。这些系统旨在通过文本或语音与用户进行交流&#xff0c;以提供信息、解决问题或执行任务。以下是关于这类系统的一些关键点&#xff1a; 核心技术&…...

如何在HTML中修改光标的位置(全面版)

如何在HTML中修改光标的位置&#xff08;全面版&#xff09; 在Web开发中&#xff0c;控制光标位置是一个重要的技巧&#xff0c;尤其是在表单处理、富文本编辑器开发或格式化输入的场景中。HTML中的光标位置操作不仅适用于表单元素&#xff08;如<input>和<textarea…...

PHP8 动态属性被弃用兼容方案

PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则&#xff0c;并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中&#xff0c;User 类…...

WPF表格控件的列利用模块适配动态枚举类

将枚举列表转化到类内部赋值&#xff0c;在初始化表格行加载和双击事件时&#xff0c;触发类里面的枚举列表的赋值 <c1:Column Header"变更类型" Binding"{Binding ChangeType, ModeTwoWay, ValidatesOnExceptionsTrue, ValidatesOnDataErrorsTrue, NotifyOn…...

【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面

sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…...

Scala的隐式转换

一&#xff1a; 1.隐式转换概述&#xff1a; 隐式转换与模式匹配都是scala中提供的比较强大的特性。 2.隐式转换的定义&#xff1a; 在实际编程中&#xff0c;要想把一个不匹配的类型赋值&#xff0c;需要先转换成匹配的类型。scala的隐式转换会自动将一种类型的数据转换成…...

从视频编码的进化历程看技术革新

人类对影像的记录和传播从未停止。从最早的胶片电影到如今的数字视频&#xff0c;技术在不断演进。在这个过程中&#xff0c;视频编码技术的发展扮演着关键角色&#xff0c;它决定着我们如何高效地存储和传输视频内容。 视频编码技术的发展历程充满智慧。上世纪90年代&#xf…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...