2389.和有限的最长子序列
链接:2389.和有限的最长子序列
难度:Easy
标签:贪心、数组、二分查找、前缀和、排序
简介:返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。
题解 1 - typescript
- 编辑时间:2022-08-28
- 执行用时:72ms
- 内存消耗:44.4MB
- 编程语言:typescript
- 解法介绍:排序后遍历。
function answerQueries(nums: number[], queries: number[]): number[] {
nums.sort((a, b) => a - b);
return queries.map(num => {
let i = 0;
let cur = 0;
while (i < nums.length && cur + nums[i] <= num) cur += nums[i++];
return i;
});
}
题解 2 - cpp
- 编辑时间:2023-03-17
- 执行用时:20ms
- 内存消耗:13.3MB
- 编程语言:cpp
- 解法介绍:排序后遍历。
class Solution {
public:
vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
int n = nums.size(), m = queries.size();
vector<int> idxs(m), res(m, 0);
for (int i = 0; i < m; i++) idxs[i] = i;
sort(idxs.begin(), idxs.end(), [&](auto &a, auto &b){
return queries[a] < queries[b];
});
sort(nums.begin(), nums.end());
int idx = 0, sum = 0;
for (int i = 0; i < m; i++) {
while (idx < n && sum + nums[idx] <= queries[idxs[i]]) sum += nums[idx++];
res[idxs[i]] = idx;
}
return res;
}
};
题解 3 - python
- 编辑时间:2023-03-17
- 执行用时:48ms
- 内存消耗:15.1MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:
n, m = len(nums), len(queries)
idxs = [i for i in range(m)]
idxs.sort(key=lambda v: queries[v])
res = [0 for i in range(m)]
nums.sort()
idx, sums = 0, 0
for i in range(m):
while idx < n and sums + nums[idx] <= queries[idxs[i]]:
sums += nums[idx]
idx += 1
res[idxs[i]] = idx
return res