2023-03-17力扣每日一题

链接:

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

猜你喜欢

转载自blog.csdn.net/Fei_WuYan/article/details/129629392