この解答例は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が比較的小さい場合に特に有効です。