JavaScript 中排序的二维数组中的第 N 个最小元素
问题
假设,我们有一个数字数组的排序数组(按递增顺序排序),如下所示-
const arr = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ];
我们需要编写一个JavaScript函数,该函数接受一个这样的数组作为第一个参数和一个整数num作为第二个参数。
我们的函数应该返回数组arr中存在的第num个最小元素。
例如,如果函数的输入是-
const arr = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ]; const num = 5;输出结果
那么输出应该是-
const output = 11;
输出说明:
11是矩阵中第五小的元素。
示例
此代码将是-
const arr = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ]; const num = 5; const kthSmallest = (arr = [], num = 1) => { let low = arr[0][0] let high = arr[arr.length-1][arr[0].length-1] + 1; while (low < high) { let mid = low + Math.floor((high-low)/2); let count = 0; for (let i = 0;i代码说明:
这里的想法是-
当我们有一个常规排序的二维数组时,我们使用一系列索引来找到我们的目标,例如,
low = 0, high = length-1, mid = (low+high)/2如果目标大于索引mid处的数字,则搜索右侧部分,如果较小,则搜索左侧部分。
但是,在这个2darr排序数组中,是不可能找到这样的mid索引的。这里的直觉是使用一系列数字来测试我们的k。我们知道第一个数字最小,最后一个数字最大,这意味着我们的目标数字必须介于两者之间。我们可以用这两个数字作为我们的low和high,并将我们的mid设置为中间的数字,并检查arr中有多少数字小于这个数字,并相应地调整low和high。
当我们得到恰好k个数字时,我们知道我们已经找到了答案。这里极其棘手的部分是,仅通过查看我们如何计算mid,很多时候我们正在测试的数字甚至可能不在arr中,因为最终,我们使用的数字只是任意数字。
为了解释这一点,我们需要想象我们的程序处于低和高几乎要相互碰撞的阶段。如果我们计算的数字比预期的少,我们将设置low=mid+1,这可能只会将我们的mid增加1。通过将我们的mid1增加1,我们可以确保这些数字包含在arr中。
输出结果
控制台中的输出将是-
11