# 和有限的最长子序列
给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。
返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
// 输入:nums = [4,5,2,1], queries = [3,10,21]
// 输出:[2,3,4]
// 解释:queries 对应的 answer 如下:
// - 子序列 [2,1] 的和小于或等于 3 。可以证明满足题目要求的子序列的最大长度是 2 ,所以 answer[0] = 2 。
// - 子序列 [4,5,1] 的和小于或等于 10 。可以证明满足题目要求的子序列的最大长度是 3 ,所以 answer[1] = 3 。
// - 子序列 [4,5,2,1] 的和小于或等于 21 。可以证明满足题目要求的子序列的最大长度是 4 ,所以 answer[2] = 4
var answerQueries = function(nums, queries) {
const n = nums.length, m = queries.length;
nums.sort((a, b) => a - b);
const f = new Array(n + 1).fill(0);
for(let i = 0; i < n; i++) {
f[i + 1] = f[i] + nums[i];
}
const answer = new Array(m).fill(0);
for(let i = 0; i < m; i++) {
answer[i] = binarySearch(f, queries[i]) - 1;
}
return answer;
}
const binarySearch = (f, target) => {
let low = 1, high = f.length;
while (low < high) {
const mid = low + Math.floor((high - low) / 2);
if (f[mid] > target) {
high = mid;
} else {
low = mid + 1;
}
}
return low;
};
← 缓存淘汰算法--LRU算法 递归 →