《剑指 Offer》专项突破版 - 面试题 75 : 数组相对排序(C++ 实现)

目录

计数排序详解

面试题 75 : 数组相对排序


 


计数排序详解

计数排序是一种线性时间整数排序算法,其算法步骤为:

  1. 找出待排序数组 nums 中的最小值和最大值(分别用 min 和 max 表示)。

  2. 创建一个长度为 max - min + 1、元素初始值全为 0 的计数器数组 count。

  3. 扫描一遍原始数组,将 nums[i] - min 作为下标,并将该下标的计数器增加 1。

  4. 扫描一遍计数器数组,按顺序把值收集起来。

排序数组:

class Solution {
public:vector<int> sortArray(vector<int>& nums) {int min = nums[0], max = nums[0];for (int i = 1; i < nums.size(); ++i){if (nums[i] < min)min = nums[i];if (nums[i] > max)max = nums[i];}
​vector<int> counts(max - min + 1, 0);for (int i = 0; i < nums.size(); ++i){++counts[nums[i] - min];}
​int j = 0;for (int i = 0; i < max - min + 1; ++i){while (counts[i] > 0){nums[j++] = i + min;--counts[i];}}return nums;}
};

如果数组的长度为 n,整数的范围(即数组中最大整数和最小整数的差值再加 1)为 k,那么计数排序的时间复杂度就是 O(n + k)。由于需要创建一个长度为 O(k) 的计数器数组 counts,因此空间复杂度为 O(k)

当 k 比较小时,无论从时间复杂度还是空间复杂度来看都是比较高效的算法。当 k 很大时,计数排序可能就不如其他排序算法(如快速排序、归并排序)高效


面试题 75 : 数组相对排序

题目

输入两个数组 arr1 和 arr2,其中数组 arr2 中的每个数字都唯一,并且都是数组 arr1 中的数字。请将数组 arr1 中的数字按照数组 arr2 中的数字的相对顺序排序。如果数组 arr1 中的数字在数组 arr2 中没有出现,那么将这些数字按递增的顺序排在后面。假设数组中的所有数字都在 0 到 1000 的范围内。例如,输入的数组 arr1 和 arr2 分别是 [2, 3, 3, 7, 3, 9, 2, 1, 7, 2] 和 [3, 2, 1],则数组 arr1 排序之后为 [3, 3, 3, 2, 2, 2, 1, 7, 7, 9]。

分析

题目明确提出数组中的数字都在 0 到 1000 的范围内,这是一个很明显的提示,据此可以考虑采用计数排序。

代码实现

class Solution {
public:vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {int min = arr1[0], max = arr1[0];for (int i = 1; i < arr1.size(); ++i){if (arr1[i] < min)min = arr1[i];if (arr1[i] > max)max = arr1[i];}
​vector<int> counts(max - min + 1, 0);for (int i = 0; i < arr1.size(); ++i){++counts[arr1[i] - min];}
​int i = 0;for (int num : arr2){while (counts[num - min] > 0){arr1[i++] = num;--counts[num - min];}}
​for (int j = 0; j < max - min + 1; ++j){while (counts[j] > 0){arr1[i++] = j + min;--counts[j];}}return arr1;}
};

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

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

相关文章

洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧

随着社会的进步和科技的发展&#xff0c;我们的生活幸福感与日俱增。为了让我们从琐碎中解脱出来&#xff0c;干洗店洗鞋店行业也日新月异。今天&#xff0c;我为大家推荐这款优秀的干洗店小程序系统&#xff0c;让您的洗衣洗鞋服务体验更上一层楼。 干洗店管理系统是一款专为洗…

阿里云和腾讯云区别价格表,云服务器费用对比2024年最新

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

python基础6_变量的使用

上篇博客讲了什么是变量, 对吧,那么这篇呢来先讲一讲变量的命名 在生活中,很多东西都有规范,对吧,比如我们给孩子取名,我们是不是得跟父母一个性,你要跟隔壁老王一个姓,是不是就不太合适, 比如你取名最好是2-4位对吧,你取个尼古拉斯赵四,是不是也不太符合我们平常的审美. 变量…

力扣热题100_普通数组_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

lvs集群介绍

目录 一、LVS集群基本介绍 1、什么是集群 2、集群的类型 2.1 负载均衡群集&#xff08;Load Balance Cluster) 2.2 高可用群集(High Availiablity Cluster) 2.3 高性能运算群集(High Performance Computing Cluster) 3、负载均衡集群的结构 ​编辑 4、LVS集群类型中的…

3D资产管理

3D 资产管理是指组织、跟踪、优化和分发 3D 模型和资产以用于游戏、电影、AR/VR 体验等各种应用的过程。 3D资产管理也称为3D内容管理。 随着游戏、电影、建筑、工程等行业中 3D 内容的增长&#xff0c;实施有效的资产管理工作流程对于提高生产力、减少错误、简化工作流程以及使…

C#使用自定义的方法设计队列类

目录 一、涉及到的知识点 1.C#中的队列类 2.自定义队列的方法 &#xff08;1&#xff09;先设计一个CList类 &#xff08;2&#xff09;再设计CQueue类 二、自定义队列的实例 一、涉及到的知识点 1.C#中的队列类 在C#中实现队列类&#xff0c;其实队列也是链表的扩展&am…

足球俱乐部管理系统:Java与SpringBoot的管理系统实践

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

MySQL存储函数

存储函数是有返回值存储过程&#xff0c;存储函数的参数只能还是IN类型的 1、语法 create function 存储函数名称 &#xff08;[参数列表]&#xff09;Returns type [characterrastic...]Begin--SQL语句Return ..;End;characterrastic说明&#xff1a;Deterministic:相同的输…

Redis场景总结

使用场景 在大型的秒杀库存扣减&#xff0c;app首页流量高峰&#xff0c;很容易将传统的关系型数据库(mysql&#xff0c;oracle等&#xff09;给压垮。 还有很多没必要持久化的数据&#xff0c;比如说短信验证码&#xff0c;点赞数等。 分布式锁。 分布式缓存(会话共享)。 …

uniapp使用openlayers加载地图服务

uniapp使用openlayers加载地图服务 <!-- 地图组件 --> <template><view id"myMap" :regionChangeItem"regionChangeItem" :change:regionChangeItem"olRender.selectAdministrativeRegion":tagSelectProducetagSelectProduce :t…

探索 MySQL 扩展 EXPLAIN 输出格式

探索 MySQL 扩展 EXPLAIN 输出格式 在数据库优化和性能调整的过程中&#xff0c;了解 SQL 查询的执行计划是至关重要的。MySQL 的 EXPLAIN 语句是一个强大的工具&#xff0c;用于分析查询的执行计划。从 MySQL 8.0.12 版本开始&#xff0c;EXPLAIN 提供了更多的扩展信息&#…

客户端向服务端传参5个方式

/** * get: parmas方式 例子&#xff1a;/:id * get: query方式 例子&#xff1a;/home?namexxx&agexxx * get: json方式 例子&#xff1a;{"name":"xxx","age":"xxx"} * post: x-www-form-urlencoded方式 例子: namexxx&age…

迷宫与陷阱

题目&#xff1a;0迷宫与陷阱 - 蓝桥云课 (lanqiao.cn) 代码&#xff1a; #include<stdio.h> #include<iostream> #include<algorithm> #include<queue> using namespace std;int n,k;//N*N矩阵大小&#xff0c;k无敌状态持续的步数 char map[1010…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

主成分分析用于综合评价

主成分分析用于综合评价是一种常用的数据降维方法。它通过寻找数据中的主要方差方向&#xff0c;将高维数据转化为低维数据&#xff0c;以便更好地理解和分析数据。主成分分析可以帮助我们发现数据中的潜在结构和模式&#xff0c;并且可以用较少的维度来表示数据。 在综合评价…

IPv6扩展头(四)——分片头

分片头部&#xff08;Fragment Header&#xff09;用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。 一、优势 IPv6 分片头具有多种优势&#xff0c;可提高网络效率&#xff0c;包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头&#xff0c;数据包在源处而不是中间…

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞&#xff0c;胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能&#xff0c;鼠标左键点击&#xff0c;胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…

数据结构-线段树

&#x1f4d1;前言 本文主要是【线段树】——线段树简单使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&…

将父目录设置为根目录

在用这个这个项目的时候https://github.com/KaiyangZhou/deep-person-reid&#xff0c; 出现了问题 原因是执行python scripts/main.py找不到模块 ModuleNotFoundError: No module named torchreid原因是根目录在当前目录 C:\\Users\\seama\\Documents\\Workspace\\deep-per…