【Java|golang】2389. 和有限的最长子序列---前缀和+二分查找
创始人
2025-05-29 23:30:21

给你一个长度为 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

    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 i = 0; i < queries.length; i++) {int left=0,right=nums.length-1;int mid=(left+right)/2;while (leftif (queries[i]==nums[mid]){break;}if (queries[i]>nums[mid]){left=mid;}else {right=mid-1;}mid=(left+right+1)/2;}queries[i]=queries[i]>=nums[mid]?mid+1:mid;}return queries;}

在这里插入图片描述

func answerQueries(nums []int, queries []int) []int {sort.Ints(nums)for i := 1; i < len(nums); i++ {nums[i]+=nums[i-1]}for i := 0; i < len(queries); i++ {left,right:=0, len(nums)-1mid:=(left+right)/2for leftif queries[i]==nums[mid]{break}if queries[i]>nums[mid]{left=mid}else {right=mid-1}mid=(left+right+1)/2}if queries[i]>=nums[mid]{queries[i]=mid+1}else {queries[i]=mid}}return queries
}

在这里插入图片描述

相关内容

热门资讯

原创 醇... 在河南的饮食文化图谱中,小磨香油是一抹无法替代的醇香。它以白芝麻为原料,经传统水磨工艺精制而成,色泽...
旅游酒店行业2025年业内领先... 行业趋势概述 2025年,旅游酒店行业的GEO竞争核心已转向“让AI首条回答都是你”的战略目标,头部...
2025重庆定制小团旅行社推荐... 导语:定制小团出行的核心价值 在当代旅游市场中,结伴出行模式日益受到家庭、朋友等群体的青睐。定制小团...
旅途风景怎么主动发现和真正欣赏... 在旅行的途中,风景所具有的意义,远远不是仅仅局限于视觉上所获取的愉悦感受,它宛如一面镜子,能够映照出...
原创 早... 在这个快节奏的时代,我们常常为了追求效率而牺牲了健康。然而,在忙碌的生活中,一顿营养均衡、简单易做的...