Longest Subsequence With Limited Sum

EasyArrayBinary SearchGreedySortingPrefix Sum

Solution

import { range } from '@algorithm/lib';
 
export function answerQueries(nums: number[], queries: number[]): number[] {
  nums.sort((a, b) => a - b);
 
  const n = nums.length;
  const prefixSum = Array.from(nums);
 
  for (const i of range(1, n)) {
    prefixSum[i] += prefixSum[i - 1];
  }
 
  const binarySearch = (query: number) => {
    let [start, end] = [0, n];
    while (start < end) {
      const mid = Math.floor((start + end) / 2);
      if (prefixSum[mid] <= query) {
        start = mid + 1;
      } else {
        end = mid;
      }
    }
    return start;
  };
 
  return queries.map(binarySearch);
}