2389. 和有限的最长子序列

题目链接:2389. 和有限的最长子序列

方法:前缀和 + 二分查找

解题思路

  1. 根据题意,子序列与nums数组的元素顺序无关,因此可以先对nums从小到大排序,并计算前缀和nums[i]+=nums[i1],此时的nums[i]表示原来nums数组[0,i]的区间和。
  2. 那么answer[i]=idx+1,其中idx为满足nums[idx]<=queries[i]nums中的最靠后坐标。则此时就变为在nums数组中找第一个大于queries[i]的下标。

代码

class Solution {
public:
    vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
        int m = queries.size();
        vector<int> ans(m);
        sort(nums.begin(), nums.end());
        for (int i = 1; i < nums.size(); i ++ ) nums[i] += nums[i - 1];
        for (int i = 0; i < m; i ++ ) ans[i] = upper_bound(nums.begin(), nums.end(), queries[i]) - nums.begin();
        return ans;
    }
};

复杂度分析

时间复杂度:O((n+m)logn)n=nums.size(),m=queries.size()
空间复杂度:O(1)

posted @   lixycc  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示