从长度为 M 的无序数组中,找出 N个最小的数

在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n)

网易有道面试题

const minTopK = (m, n) => {
const obj = {};
for (let i = 0; i < m.length; i++) {
if(!obj.hasOwnProperty(m[i])) {
obj[m[i]] = 1;
} else {
obj[m[i]] += 1;
}
}
const arr = Object.entries(obj).sort((a, b) => a[1] - b[1] > 0 ? 1 : -1);
return arr.slice(0, n).map(item => parseInt(item[0]));
};

demos

如何在 10 亿数中找出前 1000 大的数?

分治法

快速排序 partition

快速排序

O(N*logN)

基本思想:(分治)

  1. 先从数列中取出一个数作为key值;

  2. 将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;

  3. 对左右两个小数列重复第二步,直至各区间只有1个数。

middle, left, right

const QuickSort = (arr = []) => {
let m = arr[0];
let left = [];
let right = [];
for(let i of arr) {
if(i < m ) {
left.push(i);
} else {
right.push(i);
}
}
if(left.length > 1) {
left = QuickSort(left)
}
if(right.length > 1) {
right = QuickSort(right)
}
return left.concat(right);
}

bug

OK


"use strict"; /**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2020-08-01
* @modified
*
* @description 快速排序 quicksort
* @difficulty Medium
* @complexity O(n*log(n))
* @augments
* @example
* @link https://github.com/xgqfrms/leetcode/issues/7#issuecomment-669991209
* @solutions
*
*/ const log = console.log; function quickSort(arr) {
// 终止条件
if (arr.length <= 1) {
return arr;
}
// 中间index
var pivotIndex = Math.floor(arr.length / 2);
// 中间值,参考值
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
// 递归
return quickSort(left).concat([pivot], quickSort(right));
}; const arr = [12, 7, 5, 23, 18, 37, 1, 9, 17]; const test = quickSort(arr); log(`arr =\n`, arr)
log(`test =\n`, test) /* arr =
[
12, 7, 5, 23,
37, 1, 9, 17
]
test =
[
1, 5, 7, 9, 12,
17, 18, 23, 37
] */

leetcode

TopK

https://leetcode.com/problems/top-k-frequent-elements/


"use strict"; /**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2020-089-15
* @modified
*
* @description 347. Top K Frequent Elements
* @difficulty Medium
* @complexity O(n)
* @augments
* @example
* @link https://leetcode.com/problems/top-k-frequent-elements/
* @link https://leetcode-cn.com/problems/top-k-frequent-elements/
* @solutions
*
*/ const log = console.log; /**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/ var topKFrequent = function(nums, k) {
const obj = {};
const result = [];
for (let i = 0; i < nums.length; i++) {
if(!obj.hasOwnProperty(nums[i])) {
obj[nums[i]] = 1;
} else {
obj[nums[i]] += 1;
}
}
const arr = Object.entries(obj).sort((a, b) => a[1] - b[1] > 0 ? -1 : 1);
return arr.slice(0, k).map(item => parseInt(item[0]));
// return Object.entries(obj).sort((a, b) => a[1] - b[1] > 0 ? -1 : 1).slice(0, k).map(item => parseInt(item[0]));
};

refs

https://www.zhihu.com/question/28874340

https://blog.csdn.net/mashuangwe/article/details/76944143

array sort

https://www.cnblogs.com/xgqfrms/p/12440091.html

facebook hard

https://leetcode.com/problems/alien-dictionary/



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


从长度为 M 的无序数组中,找出N个最小的数的更多相关文章

  1. 从数组中找出第K大的数

    利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...

  2. 数组中找出最小的K个数

    题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...

  3. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

  4. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  5. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  6. C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

    #include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...

  7. 从数组中找出所有组合为s的数

    java版本 package numCombine; /** * 从数组中找出所有组合为s的数 * @author root * */ public class NumComberAll { publ ...

  8. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  9. 3sum(从数组中找出三个数的和为0)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

随机推荐

  1. jmeter报Address already in use: connect

    jmeter报Address already in use: connect   用windows进行jmeter压测出现java.net.BindException: Address already ...

  2. 我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法

    我教你如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法 一.介绍 最近,我在写有关使用 Jenkins 搭建企业级持续集成环境的文章,准备了四台服务器,企业级别嘛,一台就 ...

  3. KDB调试 — ARM

    1        寄存器 1.1         通用寄存器 A64指令集可以看到31个64位通用(整数)寄存器,分别是R0-R30. 在64位上下文中,这些寄存器通常使用名称x0-x30来表示; 在 ...

  4. vue初始化页面闪动问题

    使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们 ...

  5. 大数据之Hadoop技术入门汇总

    今天,小编对Hadoop入门学习知识进行了汇总,帮助大家更好地入手大数据.小编关于Hadoop入门总共发写了12篇原创文章,文章是参照尚硅谷大数据视频教程来进行撰写的. 今天,小编带你解锁正确的阅读顺 ...

  6. MySQL下载地址与Centos7安装MySQL以及启动问题排查

    目录 一.MySQL国内镜像下载 二.国内镜像相关站点 三.Centos7安装MySQL5.7 1. 下载并解压至/usr/local 2. 配置信息 3. 用户及用户组管理(提高安全) 4. 初始化 ...

  7. PowerBI系列组件关系详解

    随着数据分析工具的不断更新,我们所熟知的Excel可能已经不是你想象中的样子了. Excel和Power BI又有何千丝万缕的联系? M语言和DAX语言又是什么样的存在? 操作他们又需要掌握什么样的技 ...

  8. (十五)整合 Drools规则引擎,实现高效的业务规则

    整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...

  9. Linux slabtop命令——显示内核片缓存信息

    Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存.现代Linux内核部署了该缓存分配器以持有缓存,称之为片.不同类型的片缓存由片分配器维护. slabt ...

  10. 深度解读.NET5 授权中间件执行策略

    前文提要 2021.1月份我写了一个<这难道不是.NET5 的bug? 在线求锤?>, 讲述了我在实现[全局授权访问+特例匿名访问] 遇到的技术困惑: [特例匿名访问,还是走了认证流程]. ...