IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 算法系列-leetcode-40.最小的k个数 -> 正文阅读

[游戏开发]算法系列-leetcode-40.最小的k个数

剑指 Offer 40. 最小的k个数(简单)

输入整数数组?arr?,找出其中最小的?k?个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

排序

先排序在输出前k个数

/**
 * @param {number[]} arr
 * @param {number} k
 * @return {number[]}
 */
var getLeastNumbers = function(arr, k) {
    arr.sort((a,b)=>a-b)
    return arr.slice(0,k)
};

1.创建小根堆

2.然后按堆排序的思路逐步推出最小值

3.每次推出后重新调整堆,保持小根堆

4.这样推出的前 k 个数就是需要求的值

/**
 * @param {number[]} arr
 * @param {number} k
 * @return {number[]}
 */
var getLeastNumbers = function(arr, k) {
    let resultArray = []
    const arrLength = arr.length
    if(k === 0){
        return []
    }
    if(k === arr.length){
        return arr
    }
    createHeap(arr)
    for(let i = 1; i <= k; i++){
        resultArray.push(arr[0])
        swap(arr, 0, arrLength - i)
        ajustTree(arr, 0, arrLength - i)
    }
    return resultArray
};

var createHeap = function(arr){
    const arrLength = arr.length
    for(let i = Math.floor(arrLength / 2); i >= 0; i --){
        ajustTree(arr, i, arrLength)
    }    
}

/**
 * 调整数组形式的完美二叉树,保证根节点最小
 */

var ajustTree = function(arr, treeRootI, treeLength){
    // 用 child 指向左孩子
    let child = treeRootI * 2 + 1
    // 保证孩子节点存在
    while(child < treeLength){
        // 比较孩子节点,child 取小的那个
        if(child + 1 < treeLength && arr[child] > arr[child + 1]){
            child = child + 1
        }
        // 如果根节点比孩子节点大互换,互换后根节点指向孩子节点,孩子节点指向孙子节点
        if(arr[treeRootI] > arr[child]){
            swap(arr, treeRootI, child)
            treeRootI = child
            child = 2 * treeRootI + 1
        }
        else{
            // 避免死循环
            break 
        }
    }
}

var swap = function(arr, i, j){
    if(i === j){
        return
    }
    arr[i] = arr[i] + arr[j]
    arr[j] = arr[i] - arr[j]
    arr[i] = arr[i] - arr[j]
}

快排

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:46:08  更:2022-04-24 09:48:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 21:56:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码