2389.和有限的最长子序列
前言
题目来自LeetCode:https://leetcode.cn/problems/longest-subsequence-with-limited-sum/
题目(难度:简单)
给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。
返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
示例1
1 | 输入:nums = [4,5,2,1], queries = [3,10,21] |
提示:
- n == nums.length
- m == queries.length
- 1 <= n, m <= 1000
- 1 <= nums[i], queries[i] <= 10^6
题解
本题关键在读懂题目,题目要求子序列的和,根据子序列的定义,那么原数组的顺序就不重要了,要求小于等于queries[i]的最长子序列,那么只需要从小往大的挑,直到和大于queries[i],那么前面所挑的个数即为答案。
可以通过求前缀和(前缀数组第i项代表原数组前i项的和)解决重复求和的过程,也就是前缀数组第i项代表长度为i的子序列和最小的值。
因为本题1 <= n, m <= 1000,直接在前缀数组上寻找的时间复杂度为O(nm),也不会超出时间限制,若nm > 10^9次方时,那么就需要使用二分查找在前缀数组上查找,此时的时间复杂度为O(mlog(n)).
代码
1 | class Solution { |