Руководство по решению общей инвестиционной проблемы

В этой статье мы обсудим проблему, когда у нас есть определенный начальный капитал, и мы хотим инвестировать его в проекты, чтобы максимизировать нашу прибыль. У каждого проекта есть прибыль и потребность в капитале, и мы можем инвестировать только в ограниченное количество проектов.

Ссылка на вопрос: https://leetcode.com/problems/next-greater-element-ii/description/

Постановка задачи

Нам дано целое число k, представляющее максимальное количество проектов, в которые мы можем инвестировать, целое число w, представляющее наш начальный капитал, два массива целых чисел profits и capital, представляющие прибыль и потребность в капитале для каждого проекта. Нам нужно найти максимальный капитал, который мы можем иметь после инвестирования не более чем в k проектов.

Подход

Мы можем начать с создания массива проектов, отсортированных по их потребности в капитале. Затем мы можем создать максимальную кучу для хранения доступной прибыли. Мы будем перебирать проекты и добавлять все доступные проекты в максимальную кучу, пока не достигнем максимального количества проектов, в которые мы можем инвестировать, или у нас не закончатся доступные проекты. Мы выберем проект с наибольшей прибылью из кучи и удалим его из кучи. Мы будем повторять этот процесс до тех пор, пока не инвестируем не более k проектов или пока у нас не закончатся доступные проекты.

Код

Вот код JavaScript для решения проблемы:

function findMaximizedCapital(k, w, profits, capital) {
  // Create an array of projects, sorted by their capital requirement
  const projects = [];
  for (let i = 0; i < profits.length; i++) {
    projects.push([capital[i], profits[i]]);
  }
  projects.sort((a, b) => a[0] - b[0]);
  // Create a max heap to store available profits
  const maxHeap = new MaxHeap();
  let i = 0;
  while (k > 0) {
    // Add all available projects to the max heap
    while (i < projects.length && projects[i][0] <= w) {
      maxHeap.insert(projects[i][1]);
      i++;
    }
    // If there are no available projects, return the current capital
    if (maxHeap.isEmpty()) {
      return w;
    }
    // Choose the project with the highest profit and remove it from the heap
    w += maxHeap.extractMax();
    k--;
  }
  return w;
}
class MaxHeap {
  constructor() {
    this.heap = [];
  }
  insert(value) {
    this.heap.push(value);
    this.bubbleUp(this.heap.length - 1);
  }
  extractMax() {
    const max = this.heap[0];
    const end = this.heap.pop();
    if (this.heap.length > 0) {
      this.heap[0] = end;
      this.sinkDown(0);
    }
    return max;
  }
  isEmpty() {
    return this.heap.length === 0;
  }
  bubbleUp(index) {
    const value = this.heap[index];
    while (index > 0) {
      const parentIndex = Math.floor((index - 1) / 2);
      const parent = this.heap[parentIndex];
      if (value <= parent) {
        break;
      }
      this.heap[parentIndex] = value;
      this.heap[index] = parent;
      index = parentIndex;
    }
  }
  sinkDown(index) {
    const value = this.heap[index];
    const length = this.heap.length;
    while (true) {
      const leftChildIndex = 2 * index + 1;
      const rightChildIndex = 2 * index + 2;
      let leftChild, rightChild;
      let swap = null;
      if (leftChildIndex < length) {
        leftChild = this.heap[leftChildIndex];
        if (leftChild > value) {
          swap = leftChildIndex;
        }
      }
      if (rightChildIndex < length) {
        rightChild = this.heap[rightChildIndex];
        if (
          (swap === null && rightChild > value) ||
          (swap !== null && rightChild > leftChild)
        ) {
          swap = rightChildIndex;
        }
      }
      if (swap === null) {
        break;
      }
      this.heap[index] = this.heap[swap];
      this.heap[swap] = value;
      index = swap;
    }
  }
}

Пример

Вот пример использования функции findMaximizedCapital:

const k = 2;
const w = 0;
const profits = [1, 2, 3];
const capital = [0, 1, 1];
console.log(findMaximizedCapital(k, w, profits, capital)); // Output: 4

В этом примере у нас есть начальный капитал 0, и мы можем инвестировать не более 2 проектов. У нас есть три доступных проекта, каждый с прибылью и капиталом. Мы можем инвестировать в первый и второй проекты, которые имеют общую прибыль 1 + 2 = 3 и общую потребность в капитале 0 + 1 = 1. Наш окончательный капитал будет равен 0 + 3 = 3, но мы можем инвестировать не более чем в 2 проектов, поэтому мы инвестируем в первый и третий проекты, общая прибыль которых составляет 1 + 3 = 4, а общая потребность в капитале составляет 0 + 1 = 1. Наша последняя столица 0 + 4 = 4.

Заключение

В этой статье мы обсудили проблему, когда у нас есть определенный начальный капитал, и мы хотим инвестировать его в проекты, чтобы максимизировать нашу прибыль. Мы показали подход к решению проблемы с использованием максимальной кучи и предоставили реализацию на JavaScript.