この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
152. 上位k個の要素を返す
解答例:
以下は、ソートアルゴリズムを使用してこの問題を解決する方法です。
function topK(nums, k) { nums.sort((a, b) => b - a); // 降順にソートする return nums.slice(0, k); // 上位k個を返す}
このアルゴリズムの時間複雑度はO(nlogn)で、空間複雑度はO(1)です。よって、比較的効率的に問題を解決できます。
より効率的なアルゴリズムには、最小ヒープを使用する方法があります。このアルゴリズムの時間複雑度はO(nlogk)で、空間複雑度はO(k)です。
function topK(nums, k) { const heap = []; nums.forEach(num => { if (heap.length < k) { heap.push(num); if (heap.length === k) { buildHeap(heap); } } else if (num > heap[0]) { heap[0] = num; heapify(heap, 0); } }); return heap;}function buildHeap(arr) { const n = arr.length; for (let i = Math.floor(n / 2) - 1; i >= 0; i--) { heapify(arr, i); }}function heapify(arr, i) { const left = 2 * i + 1; const right = 2 * i + 2; let maxIndex = i; if (left < arr.length && arr[left] < arr[maxIndex]) { maxIndex = left; } if (right < arr.length && arr[right] < arr[maxIndex]) { maxIndex = right; } if (maxIndex !== i) { [arr[i], arr[maxIndex]] = [arr[maxIndex], arr[i]]; heapify(arr, maxIndex); }}
このアルゴリズムは、最初に上位k個の数を配列に追加し、この配列を最小ヒープデータ構造に変換することによって始まります。それから、各数値に対して、最小ヒープのルート要素と比較し、必要に応じて要素を交換し、ヒープの性質を保ちます。最後に、ヒープ内の要素を返します。
このアルゴリズムは、配列が非常に大きい場合に有効で、kが比較的小さい場合に特に有効です。