力扣刷题实录(大厂用题)3 —— 912. 排序数组

news/2024/7/24 10:47:49 标签: leetcode, 算法, 数据结构

912. 排序数组

力扣题目地址:https://leetcode.cn/problems/sort-an-array/

题目描述

给你一个整数数组 nums,请你将该数组升序排列。

示例 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 ∗ 1 0 4 5 * 10^4 5104
  • − 5 ∗ 1 0 4 -5 * 10^4 5104 <= nums[i] <= 5 ∗ 1 0 4 5 * 10^4 5104

分析过程

看起来是一个毫无新意的老题,心里轻蔑的一想,不就是写个快排吗。

接着几分钟就写好了快排代码,提交便提示超时。

问题何在 ? 因为这个问题要求更加严格,因此简单的两路快排是完全不够的。三路快排甚至也不满足要求,最后查了一下,发现官方教程中提到添加随机选数进而优化效果。

最后添加了一个随机索引的过程,总算解决了这个问题。花的时间也比较多。

所以总结下来这道题目本身不复杂,非常常见的快速排序题目,但是需要注意的细节就两个:

  • 三路快排
  • 随机取数

此处的随机取数是指每轮排序的时候,需要选择一个 key,将数组中的元素划分为 3 类,大于 key 的,等于 key 的,以及小于 key 的。

代码实现

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        quickSort(nums, 0, nums.size() - 1);
        return nums;
    }
    /**
    * 根据 nums[low] 作为参考,将数组划分为两组
    * @param nums 原数组
    * @param low 需要排序的子数组的索引开始
    * @param high 需要排序的子数组的索引结束
    * @return low 或者 high 因为二者相等,以后将会根据这个索引将原数组分为两个子数组
    */
    pair<int,int> partition(vector<int>& nums, int low, int high) {
        int index = rand() % (high - low) + low;
        swap(nums[index], nums[low]);
        // 作为比较的对象,接下根据大小关系把数组分为三类
        int key = nums[low];
        // 记录一下开始的位置,最后需要用到
        int start = low;
        // mid 指针走的比 low 快,会更快找到 high 然后停止
        int mid = low + 1;
        // 注意这里的停止条件是 mid 找到 high
        while (mid <= high) {
            // 如果 nums[mid] 小于 key,就放到左边 的 low + 1 的位置
            if (nums[mid] < key) {
                swap(nums[++low], nums[mid++]);
            } else if (nums[mid] > key) {
                // 如果大于 key 的话这里和两路排序没有区别,但是之前的low换成了现在的mid,注意mid指针不需要移动
                swap(nums[mid], nums[high--]);
            } else {
                // 如果相等的话,那么只需要移动mid指针,因为其他的两端已经基本有序,本地的移动跟它们没有关系
                mid++;
            }
        }
        // 最后一定要把最开始选择的 key 移动中间去,换完成后
        swap(nums[start], nums[low]);
        return {low, high};
    }

    /**
    * 快速排序
    * @param nums 待排序的数组
    * @param low 待排序的数组的开始索引
    * @param high 待排序的数组的结束索引
    */
    void quickSort(vector<int>& nums, int low, int high) {
        if (low < high) {
            pair<int, int> part = partition(nums, low, high);
            quickSort(nums, low, part.first - 1);
            quickSort(nums, part.second + 1, high);
        }
    }
};

总结

排序算法是一个比较复杂的过程 —— 特别是在不懂的时候。

因此建议也画画PPT,一个一个环节仔细分析,一个环节一个环节绘制PPT,不断地理解各个过程,不能心急。

关于快速排序欢迎参考 https://smileyan.blog.csdn.net/article/details/130900027 这篇博客分析快速排序的整个过程。

Smileyan
2023.05.30 23:26


http://www.niftyadmin.cn/n/377917.html

相关文章

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

chatgpt赋能python:Python中的构造函数

Python 中的构造函数 Python 是一门广泛应用于各种应用领域的高级编程语言&#xff0c;它支持不同的编程范式&#xff0c;包括面向对象编程。在面向对象编程中&#xff0c;构造函数是一个重要的概念。本文将介绍 Python 中的构造函数&#xff0c;并介绍如何使用它们来创建对象…

EclipseCDT远程交叉编译远程单步调试基于makefile例程(实测有效)

文章目录 前言&#xff1a;1. 新建工程2. 远程编译环境配置2.1 下载sshfs并挂载目录2.2 Debug配置2.3安装EclipseCDT的远程插件2.4 拷贝gdbserver 3. 调试总结: 前言&#xff1a; 之前写过一篇VSCode远程调试linux&#xff0c;当时是把程序以及代码通过远程的方式&#xff0c;…

2023年数学建模:参数估计与假设检验:自助法(Bootstrap)详解

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 1. 引言 2. 自助法简介 3. 自助法在参数估计中的应用 3.1 原理 3.2 使用 MATLAB 代码进行参数估计 4. 自助法在假设检验中的应用 4.1…

python如何解决js逆向混淆?

JavaScript混淆是一种保护网站安全的技术&#xff0c;混淆可将代码进行多种变形和加密&#xff0c;使得 JavaScript 代码变得难以阅读和理解。逆向混淆是混淆中的一种方式。通过逆向混淆&#xff0c;混淆的代码更难被攻击者分析和了解混淆的含义。Python 是一种强大的编程语言&…

【22-23 春学期】AI作业12-LSTM

网络 LSTM&#xff08;输入门、遗忘门、输出门&#xff09; LSTM&#xff08;长短时记忆网络&#xff09;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xff0c;能够学习长期的依赖关系。它通过原始 RNN 的隐藏层只有一个状态&#xff0c;它对于短期的输入非常敏感…

2023年数学建模随机森林:基于多个决策树的集成学习方法

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 目录 1. 什么是随机森林&#xff1f; 2. 随机森林的优缺点 3. 随机森林的构建过程 4. 特征选择 5. MATLAB实现随机森林 6. 数学建模…

代码随想录算法训练营第四十二天|0/1背包问题理论基础 416. 分割等和子集

目录 0/1背包问题理论基础 二维dp数组 一维dp数组 LeeCode 416. 分割等和子集 0/1背包问题理论基础 二维dp数组 动规五部曲 1.确定dp数组及下标含义: dp[i][j] : 从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和的最大值&#xff1b; 2…