从长度为 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. VMware虚拟机提示“以独占方式锁定此配置文件失败”!!!

    VMware异常关闭后再次启动提示"以独占方式锁定此配置文件失败"!!! 前几日在使用VMware虚拟机的时候,虚拟机突然出现了卡顿,然后就把电脑关机了重启,结果再次打开虚拟机的时 ...

  2. C#高级编程第11版 - 第二章 索引

    [1]2.1.1 Hello,World! 1. using static System.Console; // ... WriteLine("Hello World!"); 提前 ...

  3. Manachar’s Algorithm

    Manachar's Algorithm Longest palindromic substring - Wikipedia  https://en.wikipedia.org/wiki/Longes ...

  4. 网络流 - dinic + 当前弧优化【代码】

    这是初学网络流的时候从<算法竞赛进阶指南>抄下来的一份代码,自己理解的也不是很透彻. 注意,边要从 \(1\) 开始计,不然直接 \(xor\) 运算的话取反边会直接炸掉. #includ ...

  5. CF912A

    题意 你手里有 A 个黄水晶和 B 个蓝水晶,其中两个黄水晶可以造一个黄水晶球,三个蓝水晶可以造一个蓝水晶球,一黄一蓝两个水晶可以造一个绿水晶球. 现在你需要 x 个黄水晶球,y 个绿水晶球,z 个蓝 ...

  6. Box Model 盒子模型

    Box Model盒子模型,是初学者在学习HTMl5时会学到的一个重要的模型,也有一些人称它为框模型,因为盒子是属于3维,而框是平面的.称之为盒子模型,是因为其结构和盒子十分相似,其最外面是margi ...

  7. 《》——8幅图图解Java机制

    String对象不可改变的特性 String s = "abcd"; s = s.concat"ef"; equals()与hashCode()方法协作约定 H ...

  8. Redis,JedisPool工具类

    Redis,JedisPool工具类 1.JedisPool 详细配置解释代码 2.Jedis工具类 导入相关依赖: commons-pool2-2.3.jar jedis-2.7.0.jar 1.J ...

  9. Java性能优化,操作系统内核性能调优,JYM优化,Tomcat调优

    文章目录 Java性能优化 尽量在合适的场合使用单例 尽量避免随意使用静态变量 尽量避免过多过常地创建Java对象 尽量使用final修饰符 尽量使用局部变量 尽量处理好包装类型和基本类型两者的使用场 ...

  10. linux shell 条件判断if else, if elif else....

    在linux的shell中 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句: if ... else ... ...