查找数组中的第K大数(未完)

作者: 青山旁小溪边 | 来源:发表于2019-11-13 17:00 被阅读0次

写在前面的一些话

本文通过一个小问题,用多种方式解答,其中涉及到的算法不会去详细介绍,所以请看之前要有一定的算法基础,如:排列,二分等

问题

描述

设数组 A[0..N-1] 存在 N 个无序整数,找到数组 A 中的第 K(1≤K≤N) 大数。注意:结果是顺序排序后的第 K 个最大的元素,而不是第 K 个不同的最大元素。

示例

输入:A=[4,2,6,7,1,3] K=3
输出:3

随机数组

为了方便起见,还是写个随机生成数组的函数。

const randomAry = (n = 10, range = { min: 1, max: 99 }) => {
  let arr = Array.from({ length: n });
  arr = arr.map(() => {
    return Math.floor(Math.random() * (range.max - range.min + 1) + range.min);
  });
  // 去重
  arr = Array.from(new Set(arr));
  console.log(`random - ${arr}`);
  return arr;
};
let array = randomAry();

思路

1. Array.prototype.sort()

利用javascript中的sort()函数,对数组元素从大到小排序。
由于不同的js引擎对sort()的实现不同,所以不能保证排序的时间和空间复杂度。

const findKth = (arr, K) => {
  arr.sort((a, b) => b - a);
  return { arr: arr, K: arr[K - 1] };
};
let result = findKth(array, 3);
// { arr: [ 91, 86, 70, 62, 61, 56, 47, 42, 38 ], K: 70 }

选择排序

  • 每次从剩余数组元素中找到最大的元素,并将其从数组中剔除,知道进行到K次操作。时间复杂度 0(n2)。
/**
 * @Description: 每次从剩余数组元素中找到最大的元素,并将其从数组中剔除,知道进行到K次操作
 * @param { Array }: 随机数组
 * @param { Number }: 查找的第K数
 * @return { Object }:{arr:排列完的数组元素,K:第K最大} 
 */
const findKthC = (arr, K) => {
  let i = 0;
  while (i <= K) {
    if (!arr.length) break;
    let j = 0;
    for (let index = 0; index < arr.length; index++) {
      if (arr[index] > arr[j]) {
        j = index;
      }
    }
    if (i === K - 1) return arr[j];
    arr.splice(j, 1);
    i += 1;
  }
};
// { arr: [ 79, 69, 56, 50, 39, 23, 22, 8 ], K: 79 }
  • 选择排序过程中,把每次查找到的数组元素最大元素添加到一直排序序列A[0...i-1]的末尾。
/**
 * @Description: 选择排序过程中,把每次查找到的数组元素最大元素添加到一直排序序列A[0...i-1]的末尾
 * @param { Array }: 随机数组
 * @param { Number }: 查找的第K数
 * @return { Object }:{arr:排列完的数组元素,K:第K最大} 
 */
const findKthC_1 = (arr, K) => {
  for (let i = 0; i < arr.length - 1; i++) {
    let max = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] > arr[max]) {
        max = j;
      }
    }
    [arr[i], arr[max]] = [arr[max], arr[i]];
  }
  return { arr: arr, K: arr[K - 1] };
};
// { arr: [ 96, 85, 73, 44, 34, 31, 21, 20, 13, 4 ], K: 73 }

有空在写 其他排序

相关文章

  • 查找数组中的第K大数(未完)

    写在前面的一些话 本文通过一个小问题,用多种方式解答,其中涉及到的算法不会去详细介绍,所以请看之前要有一定的算法基...

  • 查找数组中第 k 大数

    写一个 getNum() 方法,该方法接收两个参数,分别为 k 和 一个无序的纯数字数组 arr,返回数组 arr...

  • 算法分析 [最大/小值] 2019-02-28

    1. 数组,查找第k大值 215. 数组中的第K个最大元素(元素不重复无序) Kth Largest Elemen...

  • leetcode-0004

    题目: 4. 寻找两个有序数组的中位数 关键词:排序 折半查找 思路: 查找第k个数,每次查找二个数组的第k/2位...

  • 大数据少资源的技巧

    61 lg(k)时间查找两个排序数组合并后第k小的元素 63 二维升序数组的快速查找 64 在海量数据中实现快速查...

  • 算法题

    行列都是有序的二维数组,查找k是否存在【查找法】 二维数组中的查找(行列分别有序数组的二分查找)【递归法】 快速排...

  • 算法 - 数组中的第K个最大元素

    题目: 分析:查找未排序的数组,找到第k个最大的元素。最简单的做法应该就是对数组进行排序,然后遍历拿到第k个最大元...

  • 实现查找一个无序数组中第k大的元素

    给定一个数组和k值,实现查找一个无序数组中第k个大的元素。取值范围在[0,1000] 方法1: 哈希桶 输入[0,...

  • 查找第 K 大的数

    题目 查找无序整数数组中第 K 大的元素。 示例 输入:[1, 0, 5, -1, 3, 2, 4], 3 输出:...

  • LeetCode热门100题算法和思路(day7)

    LeetCode215 数组中的第k个最大元素 题目详情 给定整数数组 nums 和整数 k,请返回数组中第 k ...

网友评论

    本文标题:查找数组中的第K大数(未完)

    本文链接:https://www.haomeiwen.com/subject/cwocictx.html