对于一个数组,如何找出第 n 小的数字?
例如 [10, 3, 2, 5, 8, 2, 2, 7]
传入 n = 4
,则应该返回 3。因为对数组进行非降序 排序(后一个数字大于等于前一个数)结果为 [2, 2, 2, 3, 5, 7, 8, 10],第 4 个数字(从左到右 从 1 数起)为 3。第 n 小指的就是从小到大排列后的数组下标为 n - 1 的数字。
- -10000 <= array[i] <= 10000
- 0 <= array.length <= 100000
- 1 <= n <= array.length * 数组中的元素可能会出现重复,数组里面的每个数值都大于 JS 整形的数值下界, 小于 JS 整形的数值上界
以下是我的解法:
方法一
var findNthNumber = function(array,n){
return array.sort((a,b) => a - b)[n - 1];
}
方法二:
var findNthNumber = function (array, n) {
let min = Math.min.apply(null,array);
let countMin = 0;
for (let i = 0; i < array.length; i++) {
if (array[i] === min) {
countMin++;
array.splice(i, 1);
n -= countMin;
}
}
if (n > 0) {
return findNthNumber(array, n);
} else {
return Math.min.apply(null,array);
}
}
在不考虑排序的情况下,希望能得到最优解算法。
最优解可以用快速排序的partition思想对数组进行部分排序,时间复杂度O(N)
参考资料:
https://leetcode-cn.com/probl...