LeetCode 2389.和有限的最长子序列
题目:
给你一个长度为 n
的整数数组 nums
,和一个长度为 m
的整数数组 queries
。
返回一个长度为 m
的数组 answer
,其中 answer[i]
是 nums
中 元素之和小于等于 queries[i]
的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
思路:
1.关键词:子序列 求和
2.要求的和数组元素在数组中的顺序是无关的
3.先对数组排个序,方便回答询问(把小的放进去)
4.前缀和
5.回答询问:在前缀和上二分
代码:
class Solution {public int[] answerQueries(int[] nums, int[] queries) {Arrays.sort(nums);// 原地前缀和,节省空间复杂度for (int i = 1; i < nums.length; i++) {nums[i] += nums[i - 1];}// 原地操作,节省空间复杂度for (int j = 0; j < queries.length; j++) {queries[j] = lowerBound(nums, queries[j] + 1);}return queries;}private int lowerBound(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
}
性能: