​力扣解法汇总2389. 和有限的最长子序列
创始人
2025-05-29 10:19:16

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度  。

子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。

示例 1:

输入:nums = [4,5,2,1], queries = [3,10,21]
输出:[2,3,4]
解释:queries 对应的 answer 如下:
- 子序列 [2,1] 的和小于或等于 3 。可以证明满足题目要求的子序列的最大长度是 2 ,所以 answer[0] = 2 。
- 子序列 [4,5,1] 的和小于或等于 10 。可以证明满足题目要求的子序列的最大长度是 3 ,所以 answer[1] = 3 。
- 子序列 [4,5,2,1] 的和小于或等于 21 。可以证明满足题目要求的子序列的最大长度是 4 ,所以 answer[2] = 4 。

示例 2:

输入:nums = [2,3,4,5], queries = [1]
输出:[0]
解释:空子序列是唯一一个满足元素和小于或等于 1 的子序列,所以 answer[0] = 0 。

提示:

  • n == nums.length
  • m == queries.length
  • 1 <= n, m <= 1000
  • 1 <= nums[i], queries[i] <= 106

解题思路:

* 解题思路:
* 先对nums排序,这样长度为3的子序列最小和一定时前三位,其它也同理。所以长度为N的子序列最小和一定时前N位。
* 然后我们通过二分查找,找到queries[i]在nums的位置。
 

代码:

 public int[] answerQueries(int[] nums, int[] queries) {Arrays.sort(nums);int[] sums = new int[nums.length + 1];for (int i = 0; i < nums.length; i++) {sums[i + 1] = sums[i] + nums[i];}int[] result = new int[queries.length];for (int i = 0; i < queries.length; i++) {result[i] = binarySearch(sums, queries[i]) - 1;}return result;}public int binarySearch(int[] sums, int target) {int start = 1;int end = sums.length;int middle;while (start < end) {middle = (end + start) / 2;if (target < sums[middle]) {end = middle;continue;}start = middle + 1;}return start;}

相关内容

热门资讯

高考40分作文范文【实用6篇... 高考40分作文范文 篇一:我的成长之路在我人生的成长之路上,高考是一座重要的里程碑。这场考试不仅考察...
全国高考语文作文题目汇总最新... 全国高考语文作文题目汇总最新动态 篇一全国高考语文作文题目汇总最新动态近年来,随着高考改革的不断深化...
高考信息卷语文作文范文【精彩... 高考信息卷语文作文范文 篇一人生的选择与坚持人生中充满了各种各样的选择,而这些选择往往决定了我们的未...
青海放宽高考报名录取条件(优... 青海放宽高考报名录取条件 篇一近年来,随着高考竞争的日益激烈,各地纷纷采取措施放宽高考报名录取条件,...
空军招飞高考成绩须上一本 重... 空军招飞高考成绩须上一本 重庆或招女飞行员 篇一近日,有关中国空军招飞的消息引起了广泛关注。据悉,中...