链接:
https://leetcode.cn/problems/longest-subsequence-with-limited-sum/
题意:
数组nums和数组queries,对于queries中的每一个数字temp,提供一个答案ans,ans值为nums中最长的,元素和小于等于temp的子序列的长度
子序列概念:子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
解:
贪心思维,前缀和
因为要找出小于等于temp的最长子序列,可以发现每次添加最小数字直到超过temp即可,狠狠的贪
那么可以先排序一下nums,然后前缀和,就可以得出长度为i时子序列最小值
然后虽然我觉得可能直接遍历也能过(1K*1K吧),但是我还是去写了个二分
我这个二分只能说是依托答辩QWQ
实际代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int Nmax=1E3+7;
int sz[Nmax];
int Binary_Search(int l,int r,int mao)
{
int mid=(l+r)/2;
//cout<<"BS:"<<l<<" "<<r<<" "<<mid<<" "<<sz[mid]<<" "<<sz[l]<<"&"<<sz[r]<<endl;
if(r==l+1)//特判情况1
{
if(sz[r]<=mao) return r+1;
else if(sz[l]<=mao) return l+1;
else return l;
}
if(l==r)//特判情况2
{
if(sz[l]<=mao) return l+1;
else return l;
}
if(sz[mid]==mao) return mid+1;
if(sz[mid]<mao) return Binary_Search(mid,r,mao);
if(sz[mid]>mao) return Binary_Search(l,mid-1,mao);
return 0;
}
vector<int> solve(vector<int>& nums, vector<int>& queries)
{
vector<int>ans;
sort(nums.begin(),nums.end());
int lg_nums=nums.size(),lg_q=queries.size();
sz[0]=nums[0];
for(int i=1;i<lg_nums;i++) sz[i]=sz[i-1]+nums[i];//前缀
for(auto i:queries)
{
int temp=Binary_Search(0,lg_nums-1,i);
//cout<<i<<"-temp:"<<temp<<endl;
ans.push_back(temp);
}
return ans;
}
int main()
{
vector<int>nums,queries;
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
{
int temp;cin>>temp;
nums.push_back(temp);
}
for(int i=1;i<=m;i++)
{
int temp;cin>>temp;
queries.push_back(temp);
}
vector<int>ans=solve(nums,queries);
for(auto i:ans)
{
cout<<" "<<i;
}
cout<<endl;
}
限制:
n == nums.length
m == queries.length
1 <= n, m <= 1000
1 <= nums[i], queries[i] <= 10^6