JavaScript版「剣指offer」ブラシ問題(28)最小K個数
2505 ワード
1.テーマの説明
n個の整数を入力して、一番小さいK個の数を探します.例えば4,5,1,6,2,7,3,8という8つの数字を入力すると、最小の4つの数字は1,2,3,4です.
2.テーマ分析
この問題には三つの方法があります.
考え方の1:まず並べ替えて、それから最小のを探し出しています.しかし、配列が大きいかもしれません.タイムアウトします.
考え方その2:快速秩序化の原理を利用して問題を解決する.配列のk個の数字に基づいて調整され、k番目の数字より小さい数字はすべてその左側に位置し、k番目の数字より大きい数字は全て配列の右側に位置し、調整後、配列の左に位置するk個の数字は最小のk個の数字である(このk個の数字は必ずしも並べ替えではない).
考え方3:長さKの配列を利用して、k個の現在最小の数を保存して、その後毎回中の最大値と現在値を見つけて比較します.
3.コード
考え方の一つのコード:
クイックソート思想partiotionに基づいてK番目の大きい数またはK番目の小さい数を検索します.https://www.cnblogs.com/wuguanglin/p/searchKMax.html
n個の整数を入力して、一番小さいK個の数を探します.例えば4,5,1,6,2,7,3,8という8つの数字を入力すると、最小の4つの数字は1,2,3,4です.
2.テーマ分析
この問題には三つの方法があります.
考え方の1:まず並べ替えて、それから最小のを探し出しています.しかし、配列が大きいかもしれません.タイムアウトします.
考え方その2:快速秩序化の原理を利用して問題を解決する.配列のk個の数字に基づいて調整され、k番目の数字より小さい数字はすべてその左側に位置し、k番目の数字より大きい数字は全て配列の右側に位置し、調整後、配列の左に位置するk個の数字は最小のk個の数字である(このk個の数字は必ずしも並べ替えではない).
考え方3:長さKの配列を利用して、k個の現在最小の数を保存して、その後毎回中の最大値と現在値を見つけて比較します.
3.コード
考え方の一つのコード:
function GetLeastNumbers_Solution(input, k)
{
if(input.length < k) return false;
input.sort(function(a,b){return a-b;});
return input.slice(0,k);
}
構想二コード://
function swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function partation(arr, start, end) {
var pivot = arr[end]; //
var i = start; // +1
for (var j = start; j < end; j++) {
if (arr[j] < pivot) {
swap(arr, i, j);
i++;
}
}
swap(arr, i, end);
return i;
}
function GetLeastNumbers_Solution(input, k) {
var result = [];
if (input.length < 0 || k > input.length || k <= 0) {
return false;
}
var start = 0;
var end = input.length - 1;
var p = partation(input, start, end);
while (p !== (k - 1)) {
if (p > (k - 1)) {
end = p - 1;
p = partation(input, start, end);
} else {
start = p + 1;
partation(input, start, end);
}
}
for (var i = 0; i < k; i++) {
result.push(input[i]);
}
return result;
}
考え方3コード:function getLeastNums(array, k) {
let len = array.length;
if(k > len) {
return false;
}
let arr = array.slice(0, k),
maxIndex = findMaxIndex(arr),
max = arr[maxIndex];
for(let i=k; i a - b);
}
function findMaxIndex(arr) {
let max = arr[0],
index = 0;
for(let i=1,len=arr.length; i
参考記事:https://www.cnblogs.com/echovic/p/6558985.html https://www.cnblogs.com/wuguanglin/p/GetLeastNumbers_Solutions.https://github.com/DavidChen93/-offer-JS-/blob/master/40.1%20%E6%9C%80%E5%B0%8F%E7%9A%84K%E4%B8%AA%E6%95%B0.js クイックソート思想partiotionに基づいてK番目の大きい数またはK番目の小さい数を検索します.https://www.cnblogs.com/wuguanglin/p/searchKMax.html