【算法】分治:归并之 912.排序数组(medium)
系列专栏
双指针
模拟算法
分治思想
目录
1、题目链接
2、题目介绍
3、解法
解决方案选择
解题步骤
4、代码
1、题目链接
912. 排序数组 - 力扣(LeetCode)
2、题目介绍
给你一个整数数组 nums,请你将该数组升序排列。
你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。
示例 1:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]示例 2:
输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 104-5 * 104 <= nums[i] <= 5 * 104
3、解法
解决方案选择
为了满足时间复杂度的要求,我们选择使用归并排序(Merge Sort)算法。归并排序是一种分而治之的算法,它将数组分成两半,递归地对它们进行排序,然后将结果合并成一个有序数组。这个过程的时间复杂度为 O(nlog(n)),因为它将问题分解成更小的子问题,直到子问题的大小为1(即已经排序),然后将它们合并起来。
解题步骤
- 定义辅助函数:
merge函数:负责将两个已排序的子数组合并成一个有序数组。它使用了一个临时数组tmp来存储合并过程中的元素,以避免在原始数组上进行复杂的元素移动。mergeSort函数:递归地将数组分成更小的部分,直到每个部分只包含一个元素(自然是有序的),然后调用merge函数将它们合并成有序数组。- 归并排序过程:
- 拆分:通过递归调用
mergeSort,将数组不断拆分成更小的部分,直到每个部分只包含一个元素。- 合并:在递归返回的过程中,使用
merge函数将相邻的两个已排序的子数组合并成一个有序数组。- 空间复杂度:
- 归并排序的空间复杂度主要由临时数组
tmp决定,其大小为nums.size(),因此空间复杂度为 O(n)。- 时间复杂度:
- 归并排序的时间复杂度为 O(nlog(n)),这主要是由于每次递归调用都将问题规模减半,并且合并操作的时间复杂度为 O(n)。
4、代码
class Solution {
public://归并排序//void merge(vector<int>& nums, vector<int>& tmp, int left, int mid, int right){int lsort = left, rsort = mid + 1;//两个需要进行合并区域的第一个元素下标int cur = left;//遍历tmp数组的计数器while (lsort <= mid && rsort <= right){if (nums[lsort] <= nums[rsort]){tmp[cur++] = nums[lsort++];}else {tmp[cur++] = nums[rsort++];}}//如果有剩余的数,没有参与比较,直接插入到tmp中while (lsort <= mid){tmp[cur++] = nums[lsort++];}while (rsort <= right)tmp[cur++] = nums[rsort++];while (left <= right){nums[left] = tmp[left];left++;}}//先拆分,再合并void mergeSort(vector<int>& nums, vector<int>& tmp, int left, int right){if (left < right){int mid = (right + left) / 2;mergeSort(nums, tmp, left, mid);mergeSort(nums, tmp, mid + 1, right);merge(nums, tmp, left, mid, right);}}vector<int> sortArray(vector<int>& nums) {vector<int> tmp(nums.size());mergeSort(nums, tmp, 0, nums.size() - 1);return nums;}
};
💗感谢阅读!💗
相关文章:
【算法】分治:归并之 912.排序数组(medium)
系列专栏 双指针 模拟算法 分治思想 目录 1、题目链接 2、题目介绍 3、解法 解决方案选择 解题步骤 4、代码 1、题目链接 912. 排序数组 - 力扣(LeetCode) 2、题目介绍 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 …...
Cocos 3.8.3 实现外描边效果(逃课玩法)
本来想着用Cocos 的Shader Graph照搬Unity的思路来加外描边,发现不行,然后我就想弄两个物体不就行了吗,一个是放大的版本,再放大的版本上加一个材质,这个材质面剔除选择前面的面剔除就行了,果不其然还真行。…...
著名建筑物检测与识别系统源码分享
著名建筑物检测与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…...
使用php生成图片
可以用这方法生成图片 水印 字体可以在资源绑定下载,如果字体路径不对,则不会输出文字图片 public function generateImage($text,$id) { header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:0…...
C++ 数据类型分类
在C中,数据类型可以大致分为内置类型(Built-in Types)、标准库类型(Standard Library Types)和自定义类型(User-Defined Types)三大类。 内置类型(Built-in Types) 内置…...
java安装更新jdk11后设置环境JAVA_HOME
背景,已经安装成功,但是环境还是java1.8 java -version openjdk version "11.0.23" 2024-04-16 LTS OpenJDK Runtime Environment (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.23+9-LTS) OpenJDK 64-Bit Server VM (Red_Hat-11.0.23.0.9-2.el7_9) (build 11.0.…...
Java.动态代理
1.创建一个接口 package Mydynamicproxy1;public interface Star {public abstract String sing(String str);public abstract void dance(String str); }2.创建一个BigStar类,要实现Star这个接口 package Mydynamicproxy1;public class BigStar implements Star{…...
SpringBoot自定义异常
前言 在前后端开发中,后端接口返回的数据都是JSON格式的,但是后端可能会出现一些可以未知从异常,在后端抛出这些异常的时候,也需要返回相同格式的JSON数据,这时候就需要我们设置全局异常处理器。在后端开发中…...
华为源NAT技术与目的NAT技术
1)源NAT对报文源地址进行转换,分为NAT NO-PAT,NAPT,EASY-IP,三元组NAT; (1)NAT NO-PAT原理: no-port address translation:非端口地址转换:只转换地址,不转换端口&…...
人工智能与机器学习原理精解【25】
文章目录 正则化概述一、正则化的种类二、正则化的定义三、正则化的计算四、正则化的性质五、正则化的例子 公式与计算一、正则化的种类Dropout正则化一、基本思想二、实现方法三、作用机制四、使用注意事项五、总结Dropout正则化的例子和公式。一、Dropout正则化的例子二、Dro…...
一篇文章讲清楚synchronized关键字的作用及原理
概述 在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁对象是*.class以及synchronized修…...
深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性
原始信息 论文: Well-Read Students Learn Better: On the Importance of Pre-training Compact Models作者:Iulia Turc, Ming-Wei Chang, Kenton Lee, Kristina Toutanova地址:arxiv.org/pdf/1908.08…中文:阅读良好的学生学得更…...
【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器:嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理! 其中就Observe监听类的使用,Object…...
Java笔试面试题AI答之设计模式(1)
文章目录 1. 简述什么是设计模式 ?2. 叙述常见Java设计模式分类 ?3. Java 设计模式的六大原则 ?4. 简述对 MVC 的理解, MVC 有什么优缺点?MVC 的三个核心部分:MVC 的优点:MVC 的缺点:…...
java调用opencv部署到centos7
1、官网下载opencv https://opencv.org/releases/ 2、下载opencv并解压 unzip opencv-3.4.7.zip cd opencv-3.4.7 mkdir build cd build/ 3、安装cmake yum remove cmake -y ; yum install -y gcc gcc-c make automake openssl openssl-devel wget https://cmake.org/files/…...
【python qdrant 向量数据库 完整示例代码】
测试一下python版本的dqrant向量数据库的效果,完整代码如下: 安装库 !pip install qdrant-client>1.1.1 !pip install -U sentence-transformers导入 from qdrant_client import models, QdrantClient from sentence_transformers import SentenceT…...
初识C语言(三)
感兴趣的朋友们可以留个关注,我们共同交流,相互促进学习。 文章目录 前言 八、函数 九、数组 (1)数组的定义 (2)数组的下标和使用 十、操作符 (1)算数操作符 (2ÿ…...
用通义灵码如何快速合理解决遗留代码问题?
本文首先介绍了遗留代码的概念,并对遗留代码进行了分类。针对不同类型的遗留代码,提供了相应的处理策略。此外,本文重点介绍了通义灵码在维护遗留代码过程中能提供哪些支持。 什么是遗留代码 与过时技术相关的代码: 与不再受支持的…...
新书推荐——《Python贝叶斯深度学习》
在过去的十年中,机器学习领域取得了长足的进步,并因此激发了公众的想象力。但我们必须记住,尽管这些算法令人印象深刻,但它们并非完美无缺。本书旨在通过平实的语言介绍如何在深度学习中利用贝叶斯推理,帮助读者掌握开…...
数据结构-3.1.栈的基本概念
一.栈的定义: 栈和线性表的区别:栈只能在表尾一端进行插入或者删除的操作,而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语: 三.栈的基本操作: 1.回顾线性表的基本操作: 2.栈的基本操作&…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
