leetcode912.排序数组的题解

题目描述:

题目要求在不使用任何内置函数的情况下解决问题,时间复杂度为 O(nlog(n))。

笔者使用了快速排序,但是直接使用最原始的快速排序,有些特殊的测试用例会超时。

1)如果数组本身基本有序,则使用原始快速排序算法选取基准的方式,时间复杂度会退化为O(n^2),所以这里使用了随机选取基准点的方式,代码为

int randomIndex = left + rand()%(right-left+1);

swap(nums, left, randomIndex);

2)如果数组中出现了重复元素,速度也会变慢,在得到基准元素、排序之后,在递归调用排序函数前,先去除位置与基准相近、值与基准相同的元素,为什么选取基准呢?笔者认为其他位置的元素不是特别固定,选取基准后、进行一轮排序后,基准前后的元素与基准之间的大小关系是固定的,如果数组中有元素重复,那么在固定基准及其位置后,前后与基准相同的元素与数组前面或后面的大小关系也是确定的,其位置也不用调整了。

所以,最终代码是在原始快速排序基础上加上了随机选取基准点、去除重复元素,代码如下所示:

class Solution {
public:void swap(vector<int>& nums, int i, int j) {if(i == j) {return;}int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}void quicksort(vector<int>& nums, int left, int right) {if(left == right) {return;}int i = left;int j = right;int randomIndex = left + rand()%(right-left+1);swap(nums, left, randomIndex);while(i < j) {while((i < j) && (nums[j] >= nums[left])) {j--;}while((i < j) && (nums[i] <= nums[left])) {i++;}swap(nums, i, j);}swap(nums, left, i);if(i-left > 1) {int left_pivot = i - 1;while((left_pivot > left) && (nums[left_pivot] == nums[i])) {left_pivot--;}quicksort(nums, left, left_pivot);}if(right-i > 1) {int right_pivot = i + 1;while((right_pivot < right) && (nums[right_pivot] == nums[i])) {right_pivot++;}quicksort(nums, right_pivot, right);}}vector<int> sortArray(vector<int>& nums) {srand(time(0));quicksort(nums, 0, nums.size()-1);return nums;        }
};

思考:经典算法、前人经验当然是很好的,能够解决大部分问题,但是总有新的未知的情况出现,那么如何改进经典算法解决现有问题就是一个有趣的事情,把前人的算法理解透彻、算法的每一步的作用、新问题给现有算法带来了哪些挑战、如何改进原有算法既能不影响对于原有测试用例的处理效果又能改进对于新问题的处理效果,怎么办呢,勤学好问、多思考、多见识,把有趣的问题想清楚、弄明白,不贪多求全,找准方向、方法,刻意训练。

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

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

相关文章

TikTok品牌出海:从“流量为王”到“价值为王”

随着市场竞争的加剧&#xff0c;品牌逐渐意识到&#xff0c;仅仅依靠流量已不足以在海外市场立足&#xff0c;必须实现从“流量为王”到“价值为王”的转变。本文Nox聚星将和大家探讨品牌如何与TikTok达人合作&#xff0c;在海外市场中建立长期稳定的品牌形象。 一、品牌出海的…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…

Kafka 可观测性最佳实践

Kafka 概述 Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列&#xff0c;是一个实时数据处理系统&#xff0c;可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点&#xff1a; 异步处理服务解耦流量削峰 监控 Kafka 是非常重要的&#xff0c;因…

《XGBoost算法的原理推导》12-13树的叶子节点权重w和映射关系q 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们重新定义一颗树&#xff0c;包括两个部分&#xff1a; 叶子结点的权重向量 w w w&#xff1b;实例 -> 叶子结点的映射关系 q q q&#xff08;本质是树的…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

多client向同一个pushgateway推送指标被覆盖问题

问题: 多个client向同一个pushgateway推送指标&#xff0c;每个client推送的指标名称相同但是lable不同。如下&#xff1a; # TYPE ObjectCount gauge ObjectCount{server_id"server1"} 4 ObjectCount{server_id"server2"} 4 ObjectCount{server_id"…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

梧桐数据库中处理连续日期序列的解决方案

在数据库管理中&#xff0c;处理时间序列数据是一项常见的任务&#xff0c;尤其是在需要识别连续日期序列的场景中。例如&#xff0c;在一个生产环境中&#xff0c;我们可能需要跟踪产品的输出类型&#xff0c;并记录这些输出是否连续。本文将介绍如何在梧桐数据库中实现这一功…

增删改增删改

savePostMapping("/save") public ResponseResult save(RequestBody ChannelDto channelDto){ // 参数判断 if(channelDto null || StringUtils.isBlank(channelDto.getName())){ return ResponseResult.error(AppHttpCodeEnum.PARA…

消费疲软下,家居品牌如何利用营销实现新的突围与增长?

在消费疲软的大环境下&#xff0c;家居品牌面临着前所未有的挑战与机遇。尤其以耐消品为主的家居行业&#xff0c;也受到一定程度影响——有效需求不足导致产能过剩&#xff0c;营销乏力&#xff0c;市场竞争开始变得激烈&#xff0c;不少家居品牌正在面临业绩压力。家居品牌如…

Apache Shiro -配置先后的影响

在Apache Shiro框架中&#xff0c;shiroFilterChainDefinition&#xff08;或filterChainDefinitions&#xff09;的配置顺序确实有影响。以下是具体的影响和原因&#xff1a; URL匹配规则&#xff1a;Shiro在验证URL时&#xff0c;会按照filterChainDefinitions中配置的顺序进…

How to use ffmpeg to convert video format from .webm to .mp4

The .mp4 container format doesn’t support the VP8 codec, which is commonly used in .webm files. MP4 containers typically use the H.264 codec for video and AAC for audio. You’ll need to re-encode the video using the H.264 codec and re-encode the audio us…

ORACLE _11G_R2_ASM 常用命令

--------查看磁盘组&#xff0c;(空间情况) select name,state,free_mb,total_mb,usable_file_mb from v$asm_diskgroup; --------查看磁盘情况 select GROUP_NUMBER,free_mb,total_mb,disk_number,MOUNT_STATUS,mode_status, HEADER_STATUS,name,PATH from v$asm_disk order …

连985都没有面试机会 二本就更没戏了:瞎说,这就是三年高考的意义

最近有二本同学在直播里说&#xff1a;“看到很多面经说&#xff0c;连985同学都没有面试机会&#xff0c;而且是零offer。那我们二本就更没戏了。” 其实这种言论是在瞎扯。 我们一直在强调校招是分层的。 现在学生太多了&#xff0c;而且招聘对学历是有要求的。比如大厂的…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加&#xff0c;增加&#xff1a;2024年第45周|共53周&#xff0c;星期三&#xff0c;今年时间剩余&#xff0c;本周时间剩余} 开源竞争&#xff1a; 开源竞争&#xff08;当你无法掌握一个技术就开源这个技术…

greendao使用封装

1. 确保正确配置 greenDAO 首先,确保您在项目的 build.gradle 文件中添加了 greenDAO 的依赖: dependencies {implementation org.greenrobot:greendao:3.3.0 // 根据需要选择合适的版本annotationProcessor org.greenrobot:greendao-compiler:3.3.0 // 仅在 Java 中使用 }…

linux tar 打包为多个文件

将目录打包成多个大小为 80MB 的文件&#xff0c;可以使用以下命令&#xff1a; tar -cf - my_folder | split -b 80m - my_folder.tar.解释&#xff1a; tar -cf - my_folder 将 my_folder 目录打包成一个 tar 文件并通过管道 (|) 输出到标准输出。 split -b 80m - my_fold…

小程序开发进阶之路: 重新认识产品经理

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署&#xff0c;所有环节都由我一人包办。经过一个月的努力&#xff0c;…

高分辨率高电流监控器电路设计

1 简介 该单电源电流检测解决方案可以在分流电阻器上测量50mA 至10A 范围内的电流信号。电流检测放大器可以在0V 至75V 的宽共模电压范围内测量分流电阻器。全差分放大器(FDA) 执行单端至差分转换&#xff0c;并以1MSPS 的最大数据速率驱动范围为5V 的SAR ADC 差分输入。可以调…

Neo4j入门:详解Cypher查询语言中的MATCH语句

Neo4j入门&#xff1a;详解Cypher查询语言中的MATCH语句 引言什么是MATCH语句&#xff1f;示例数据1. 基础节点查询查询所有节点按标签查询节点 2. 关系查询基础关系查询指定关系方向指定关系类型 3. 使用WHERE子句4. 使用参数5. 多重MATCH和WITH子句实用技巧总结 引言 大家好…