leetcode 912. 排序数组

912. 排序数组

题目

给你一个整数数组 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

题解

  • 接收一个数组 nums,通过计数排序的方法对数组进行排序,并返回排序后的新数组 newArr
  • 时间复杂度: O(n+k) 找出最大值和最小值的循环遍历了数组 nums 一次,时间复杂度为O(n) ,其中 n是数组 nums 的长度。

    统计元素出现次数的循环也遍历了数组 nums 一次,时间复杂度为O(n) 。

    根据计数数组重建排序后的数组的循环遍历了计数数组 arr 一次,时间复杂度为O(k) ,其中k是计数数组的长度(k=max - min +1)。

    总的时间复杂度为O(n+k)。

js 复制代码
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortArray = function (nums) {
    // 找最大最小值
    let max = 0;
    let min = 0;
    for (let i = 0; i < nums.length; i++) {
        max = max > nums[i] ? max : nums[i];
        min = min < nums[i] ? min : nums[i];
    }
    const newArr = [];
    // 初始化数组长度为参数长度
    const arr = new Array(max - min + 1).fill(0);
    // 统计每一个值出现的次数
    for (let i = 0; i < nums.length; i++) {
        let arrIndex = nums[i] - min;
        if (arr[arrIndex] !== undefined) {
            arr[arrIndex] += 1;
        } else {
            arr[arrIndex] = 1;
        }
    }
    // 把有值的数据放到新数组里
    for (let i = 0; i < arr.length; i++) {
        const list = new Array(arr[i]).fill(min + i);
        newArr.push(...list);
    }
    return newArr;
};
相关推荐
j_xxx404_1 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺1 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
Lris-KK1 小时前
【Leetcode】高频SQL基础题--180.连续出现的数字
sql·leetcode
THMAIL1 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
珍珠是蚌的眼泪1 小时前
LeetCode_位运算
leetcode·位运算·异或·韩明距离·数字的补数
野犬寒鸦1 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香1 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展
岁忧2 小时前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
一枝小雨2 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
Tisfy2 小时前
LeetCode 3516.找到最近的人:计算绝对值大小
数学·算法·leetcode·题解