排序题目:第三大的数

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
      • 进阶
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法三
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:第三大的数

出处:414. 第三大的数

难度

2 级

题目描述

要求

给定整数数组 nums \texttt{nums} nums,返回数组中第三大的不同数。如果不存在,则返回数组中最大的数。

示例

示例 1:

输入: num = [3, 2, 1] \texttt{num = [3, 2, 1]} num = [3, 2, 1]
输出: 1 \texttt{1} 1
解释:
第一大的不同数是 3 \texttt{3} 3
第二大的不同数是 2 \texttt{2} 2
第三大的不同数是 1 \texttt{1} 1

示例 2:

输入: num = [1, 2] \texttt{num = [1, 2]} num = [1, 2]
输出: 2 \texttt{2} 2
解释:
第一大的不同数是 2 \texttt{2} 2
第二大的不同数是 1 \texttt{1} 1
第三大的不同数不存在,所以返回最大的数 2 \texttt{2} 2

示例 3:

输入: num = [2, 2, 3, 1] \texttt{num = [2, 2, 3, 1]} num = [2, 2, 3, 1]
输出: 1 \texttt{1} 1
解释:
第一大的不同数是 3 \texttt{3} 3
第二大的不同数是 2 \texttt{2} 2(两个 2 \texttt{2} 2 都是第二大的不同数,因为值相同)。
第三大的不同数是 1 \texttt{1} 1

数据范围

  • 1 ≤ nums.length ≤ 10 4 \texttt{1} \le \texttt{nums.length} \le \texttt{10}^\texttt{4} 1nums.length104
  • -2 31 ≤ nums[i] ≤ 2 31 − 1 \texttt{-2}^\texttt{31} \le \texttt{nums[i]} \le \texttt{2}^\texttt{31} - \texttt{1} -231nums[i]2311

进阶

你能设计一个时间复杂度 O(n) \texttt{O(n)} O(n) 的解决方案吗?

解法一

思路和算法

这道题目要求返回数组 nums \textit{nums} nums 中第三大的不同数,即排序时相同的元素只计算一次。为了确保相同的元素只计算一次,可以使用哈希集合存储数组中的元素。

将数组中的元素全部加入哈希集合之后,新建一个数组存储哈希集合中的全部元素,然后对新数组排序,新数组的长度即为数组 nums \textit{nums} nums 中的不同元素个数。

当新数组的长度至少为 3 3 3 时,存在第三大的不同数,返回新数组中的第三大元素。当新数组的长度小于 3 3 3 时,不存在第三大的不同数,返回新数组中的最大元素。

代码

class Solution {public int thirdMax(int[] nums) {Set<Integer> set = new HashSet<Integer>();for (int num : nums) {set.add(num);}int size = set.size();int[] distinct = new int[size];int index = 0;for (int num : set) {distinct[index++] = num;}Arrays.sort(distinct);return size >= 3 ? distinct[size - 3] : distinct[size - 1];}
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 nums \textit{nums} nums 的长度。使用哈希集合与新数组存储数组 nums \textit{nums} nums 中的元素需要 O ( n ) O(n) O(n) 的时间,对新数组排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间,因此时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。哈希集合与新数组需要 O ( n ) O(n) O(n) 的空间。

解法二

思路和算法

解法一使用哈希集合确保相同的元素只计算一次,也可以直接对原数组排序和遍历,达到确保相同的元素只计算一次的目的。

对数组 nums \textit{nums} nums 排序,由于 Java 自带的 Arrays.sort \texttt{Arrays.sort} Arrays.sort 对于基本数据类型排序都是升序排序,因此排序后的数组中,末尾元素是最大元素。

排序之后,从后往前遍历数组 nums \textit{nums} nums,遍历过程中维护遍历到的不同元素个数。由于末尾元素是最大元素,因此遍历时跳过末尾元素,将不同元素个数初始化为 1 1 1。对于每个遍历到的元素,执行如下操作。

  • 如果当前元素等于上一个遍历到的元素(即当前元素下标加 1 1 1 位置的元素),则没有遇到新的不同元素,跳过当前元素。

  • 如果当前元素不等于上一个遍历到的元素,则当前元素一定小于上一个遍历到的元素(由于数组已经有序),将不同元素个数加 1 1 1。如果不同元素个数等于 3 3 3,则当前元素为第三大的不同数,返回当前元素。

如果遍历结束之后,不同元素个数小于 3 3 3,则第三大的不同数不存在,返回排序后的数组的末尾元素。

代码

class Solution {public int thirdMax(int[] nums) {Arrays.sort(nums);int length = nums.length;int count = 1;for (int i = length - 2; i >= 0; i--) {if (nums[i] != nums[i + 1]) {count++;if (count == 3) {return nums[i];}}}return nums[length - 1];}
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间,反向遍历数组需要 O ( n ) O(n) O(n) 的时间,因此时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)

  • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 nums \textit{nums} nums 的长度。排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间。

解法三

思路和算法

上述两种解法都需要排序,时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)。如果要将时间复杂度降低到 O ( n ) O(n) O(n),则需要直接遍历数组找到第三大的不同数。

使用三个变量 first \textit{first} first second \textit{second} second third \textit{third} third 分别表示第一大的不同数、第二大的不同数和第三大的不同数。由于数组 nums \textit{nums} nums 中的元素范围是整个 int \texttt{int} int 类型的取值范围,为了避免初始化的值与数组中的元素重复,将 first \textit{first} first second \textit{second} second third \textit{third} third 都声明成 long \texttt{long} long 类型,并初始化为 long \texttt{long} long 类型的最小值,即 − 2 63 -2^{63} 263

遍历数组 nums \textit{nums} nums,遍历过程中维护遍历到的不同元素个数。对于每个元素 num \textit{num} num,如果 num \textit{num} num first \textit{first} first second \textit{second} second third \textit{third} third 相等,则跳过,当 num \textit{num} num first \textit{first} first second \textit{second} second third \textit{third} third 都不相等时,执行如下操作。

  • 如果 num > first \textit{num} > \textit{first} num>first,则将 first \textit{first} first second \textit{second} second third \textit{third} third 的值分别更新为 num \textit{num} num first \textit{first} first second \textit{second} second,将不同元素个数加 1 1 1

  • 如果 second < num < first \textit{second} < \textit{num} < \textit{first} second<num<first,则将 second \textit{second} second third \textit{third} third 的值分别更新为 num \textit{num} num second \textit{second} second first \textit{first} first 的值不变,将不同元素个数加 1 1 1

  • 如果 third < num < second \textit{third} < \textit{num} < \textit{second} third<num<second,则将 third \textit{third} third 的值更新为 num \textit{num} num first \textit{first} first second \textit{second} second 的值不变,将不同元素个数加 1 1 1

遍历结束之后,如果不同元素个数大于等于 3 3 3,则第三大的不同数存在,返回 third \textit{third} third,否则第三大的不同数不存在,返回 first \textit{first} first

代码

class Solution {public int thirdMax(int[] nums) {long first = Long.MIN_VALUE;long second = Long.MIN_VALUE;long third = Long.MIN_VALUE;int count = 0;for (long num : nums) {if (num == first || num == second || num == third) {continue;}if (num > first) {third = second;second = first;first = num;count++;} else if (num > second) {third = second;second = num;count++;} else if (num > third) {third = num;count++;}}return count >= 3 ? (int) third : (int) first;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。需要遍历数组一次。

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

从几个角度分析chatgpt、chatglm、通义千问之间的实际使用差距

第一个问题 chatglm作为经济实力最弱的一家无法实现平峰的使用体验&#xff0c;在很多时候会出现因为网络问题、集群计算上限问题导致的客户体验较差&#xff0c;无法快速返回用户所期待的内容。 在日常生活中因为本人是一名程序员&#xff0c;在方案、代码纠错、自然语言转代码…

P3842 [TJOI2007] 线段

[TJOI2007] 线段 题目描述 在一个 n n n \times n nn 的平面上&#xff0c;在每一行中有一条线段&#xff0c;第 i i i 行的线段的左端点是 ( i , L i ) (i, L_{i}) (i,Li​)&#xff0c;右端点是 ( i , R i ) (i, R_{i}) (i,Ri​)。 你从 ( 1 , 1 ) (1,1) (1,1) 点出发…

前端项目打包部署

打包 vue-cli脚手架的前端项目&#xff0c;点击npm脚本中的第二条编译命令&#xff0c;即可将项目编译&#xff0c;生成一个dist的文件夹&#xff0c;里面存放的就是编译好的前端项目文件&#xff0c;没有脚手架就在终端敲击npm run build命令编译前端项目 部署 Nginx 介绍:…

IsotonicRegression、LinearRegression、RandomForestRegressor与FMRegressor

IsotonicRegression 核心原理&#xff1a; 保序回归&#xff08;Isotonic Regression&#xff09;是一种非参数回归方法&#xff0c;适用于处理有序数据。它试图在保持数据顺序的同时&#xff0c;拟合出一个单调非减或非增的函数。 数学表达式&#xff1a; 保序回归的目标是找…

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容,在文档中插入图片)

Python使用总结之Python-docx操作Word文件(添加、编辑和删除文档内容&#xff0c;在文档中插入图片) python-docx 是一个用于创建和修改 Microsoft Word (.docx) 文件的Python库。本文将详细介绍如何使用 python-docx 创建、编辑、删除Word文件&#xff0c;以及如何添加、编辑和…

linux配置用户

一&#xff0c;安装sudo与确保在管理员用户下 apt update apt install sudo -y 切换用户&#xff1a;密码不会显示&#xff0c;一个个输入然后回车。//图中是zfxt-->Stable用户切换 su root //root为用户名 以其他用户执行命令&#xff1a; su root ping baidu.com //su…

如何在pandas创建一个seris结构?

创建一个Series结构在pandas库中是非常简单的。Series是一个一维的、大小可变的、可以存储任何数据类型的数组&#xff0c;并且有一个与之关联的标签序列&#xff08;索引&#xff09;。 以下是如何创建一个Series的基本步骤&#xff1a; 导入pandas库&#xff1a; 首先&#…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 &#x1f349;人工智能在制造业中的应用 &#x1f348; 应用场景及便利 &#x1f34d;生产线自动化 &#x1f34d;质量控制 &#x1f34d;预测性维护 &#x1f34d;供应链优化 &#x1f348; 技术实现及核心 &#x1f34d;机器学习和…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】感知器

感知器是一种非常早期的线性分类模型&#xff0c;作为一种简单的神经网络模型被提出。感知器是一种模拟生物神经元行为的机器&#xff0c;有与生物神经元相对应的部件&#xff0c;如权重&#xff08;突触&#xff09;、偏置&#xff08;阈值&#xff09;及激活函数&#xff08;…

Vue3.0:前端开发的新纪元,核心特性全览

随着 Vue 3.0 的发布&#xff0c;它带来了许多令人兴奋的新特性&#xff0c;这些特性不仅提升了框架的性能&#xff0c;还简化了开发流程。在这篇文章中&#xff0c;我们将一起探讨 Vue 3.0 的一些关键新特性&#xff0c;并通过一些直观小例子来说明它们是如何工作的。 1. 响应…

C# —— 异常捕获

通过对异常进行补捕获 可以避免掉代码运行错误时 程序直接卡死 基本语法 try &#xff1a; 试 try { // 希望进行异常捕获的代码 // 放到try中 // 如果try中的代码报错 程序也不会卡死 } catch : 捕获 catch { // try中代码出错 会执行 catch中的代码块 来捕…

CobaltStrike权限传递MSF

一、测试环境 操作系统&#xff1a; 1.VMware17 2.kali 6.1.0-kali5-amd64 3.Win10x64 软件&#xff1a; 1.cs4.0 2.metasploit v6.3.4-dev 二、测试思路 1.cs是一款渗透测试工具&#xff0c;但没有漏洞利用的模块&#xff0c;我们可以在拿到目标主机的权限后&#xff0c;将…

高速直线导轨驱动与控制,精准稳定的运动核心元件

直线导轨在工业生产中&#xff0c;精度和稳定性是至关重要的。而在各种机械设备中&#xff0c;高精度直线导轨是提高设备运动控制精度和平稳性的核心部件&#xff0c;当我们考虑高速运动时&#xff0c;直线导轨的精度和稳定性是非常重要的因素。 直线导轨系统中如何确保高速运动…

DeepSeek-V2-Chat多卡推理(不考虑性能)

TOC 本文演示了如何使用accelerate推理DeepSeek-V2-Chat(裁剪以后的模型,仅演示如何将权值拆到多卡) 代码 import torch from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig from accelerate import init_empty_weights import sys from acce…

Mysql的null值处理

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ 在Mysql中&#xff0c;null用于标识缺失的或未知的数据&#xff0c;处理null值需要特别小心&#xff0c;因为在数据库中塔可能会导致不…

怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法

jpg作为最常用的一种图片格式&#xff0c;在遇到图片太大问题时&#xff0c;该如何操作能够快速在压缩图片jpg的大小呢&#xff1f;图片太大无法上传时目前常见的一个使用问题&#xff0c;只有将图片处理到合适的大小才可以正常在平台上传使用&#xff0c;一般情况下想要快速解…

LLM大模型开发的一般流程

何谓大模型开发&#xff1f; 将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。 主要功能点&#xff1a; 调用工具prompt engineering数据工程业务逻辑拆分 一般开发流程&#xff1a;…

API安全性的重要性及实施策略

在当今日益互联的世界中&#xff0c;API&#xff08;应用程序编程接口&#xff09;成为连接不同软件系统的关键桥梁。随着API的使用越来越广泛&#xff0c;其安全性问题也日益凸显。一个不安全的API可能会使企业数据和用户信息面临严重的风险。因此&#xff0c;确保API的安全性…

Perl语言入门学习

引言 Perl是一种功能强大的编程语言&#xff0c;广泛用于文本处理、系统管理和Web开发。它以其灵活性和强大的正则表达式处理能力著称。本篇博客将介绍Perl的基础知识&#xff0c;并通过多个例子帮助初学者快速上手。 1. 安装Perl 在开始学习Perl之前&#xff0c;您需要确保…

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…