2389. Longest Subsequence With Limited Sum
Description
You are given an integer array nums
of length n
, and an integer array queries
of length m
.
Return an array answer
of length m
where answer[i]
is the maximum size of a subsequence that you can take from nums
such that the sum of its elements is less than or equal to queries[i]
.
A subsequence is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: nums = [4,5,2,1], queries = [3,10,21] Output: [2,3,4] Explanation: We answer the queries as follows: - The subsequence [2,1] has a sum less than or equal to 3. It can be proven that 2 is the maximum size of such a subsequence, so answer[0] = 2. - The subsequence [4,5,1] has a sum less than or equal to 10. It can be proven that 3 is the maximum size of such a subsequence, so answer[1] = 3. - The subsequence [4,5,2,1] has a sum less than or equal to 21. It can be proven that 4 is the maximum size of such a subsequence, so answer[2] = 4.
Example 2:
Input: nums = [2,3,4,5], queries = [1] Output: [0] Explanation: The empty subsequence is the only subsequence that has a sum less than or equal to 1, so answer[0] = 0.
Constraints:
n == nums.length
m == queries.length
1 <= n, m <= 1000
1 <= nums[i], queries[i] <= 106
Solutions
Solution 1: Sorting + Prefix Sum + Binary Search
According to the problem description, for each \(\textit{queries[i]}\), we need to find a subsequence such that the sum of its elements does not exceed \(\textit{queries[i]}\) and the length of the subsequence is maximized. Obviously, we should choose the smallest possible elements to maximize the length of the subsequence.
Therefore, we can first sort the array \(\textit{nums}\) in ascending order, and then for each \(\textit{queries[i]}\), we can use binary search to find the smallest index \(j\) such that \(\textit{nums}[0] + \textit{nums}[1] + \cdots + \textit{nums}[j] > \textit{queries[i]}\). At this point, \(\textit{nums}[0] + \textit{nums}[1] + \cdots + \textit{nums}[j - 1]\) is the sum of the elements of the subsequence that meets the condition, and the length of this subsequence is \(j\). Therefore, we can add \(j\) to the answer array.
The time complexity is \(O((n + m) \times \log n)\), and the space complexity is \(O(n)\) or \(O(\log n)\). Here, \(n\) and \(m\) are the lengths of the arrays \(\textit{nums}\) and \(\textit{queries}\), respectively.
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Solution 2: Sorting + Offline Query + Two Pointers
Similar to Solution 1, we can first sort the array \(nums\) in ascending order.
Next, we define an index array \(idx\) of the same length as \(queries\), where \(idx[i] = i\). Then, we sort the array \(idx\) in ascending order based on the values in \(queries\). This way, we can process the elements in \(queries\) in ascending order.
We use a variable \(s\) to record the sum of the currently selected elements and a variable \(j\) to record the number of currently selected elements. Initially, \(s = j = 0\).
We traverse the index array \(idx\), and for each index \(i\) in it, we iteratively add elements from the array \(nums\) to the current subsequence until \(s + nums[j] \gt queries[i]\). At this point, \(j\) is the length of the subsequence that meets the condition. We set the value of \(ans[i]\) to \(j\) and then continue to process the next index.
After traversing the index array \(idx\), we obtain the answer array \(ans\), where \(ans[i]\) is the length of the subsequence that satisfies \(queries[i]\).
The time complexity is \(O(n \times \log n + m)\), and the space complexity is \(O(m)\). Here, \(n\) and \(m\) are the lengths of the arrays \(nums\) and \(queries\), respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|