题目描述
给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。
返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
示例 1:
输入: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 。
示例 2:
输入:nums = [2,3,4,5], queries = [1]
输出:[0]
解释:空子序列是唯一一个满足元素和小于或等于 1 的子序列,所以 answer[0] = 0 。
提示:
- n == nums.length
- m == queries.length
- 1 <= n, m <= 1000
- 1 <= nums[i], queries[i] <= 106
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-subsequence-with-limited-sum
题目分析
将nums排序后求前缀和
class Solution {
public:
vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
int nums_len = nums.size();
int q_len=queries.size();
vector<int> ans(q_len);
int sum[nums_len];
sort(nums.begin(),nums.end());
for(int i=0;i<nums_len;i++){
if(i==0) sum[i]=nums[i];
else sum[i]=sum[i-1]+nums[i];
}
for(int i=0;i<q_len;i++)
{
int flag=0;
for(int j=0;j<nums_len;j++){
if(queries[i]<sum[j]){
ans[i]=j;
flag=1;
break;
}
}
if(!flag) ans[i]=nums_len; //如果循环结束都没有找到比queries[i]大的sum[i],说明整个数组都满足条件
}
return ans;
}
};
总结
力扣真的最近偏爱子数组系列
今天不知道为什么网站一直很卡,体验很差,还好题很简单