题意
题目链接
给二个数组,第一个数组里面的最多元素的子序列和小于第二个数组的每一个数的集合。
思路
把数组由小到大排序,然后累加和(num[n] = sum(num[0]…num[n])),如果恰好大于这个和,下标就是答案。直接进行二分查找,减少查询复杂度。
代码
class Solution {
public:
vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
sort(nums.begin(), nums.end());
for (auto i = 1; i < nums.size(); ++i)
nums[i] += nums[i - 1];
vector<int> ans;
for (auto &sum:queries)
{
int l = 0, r = nums.size() - 1;
while (l <= r)
{
const int mid = (l + r) >> 1;
if (nums[mid] > sum)
r = mid - 1;
else if (nums[mid] == sum)
{
l = mid + 1;
break;
}
else
l = mid + 1;
}
ans.push_back(l);
}
return ans;
}
};