【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
}

在这里插入图片描述

相关内容

热门资讯

外宾考察团常州包车服务全攻略:... 外宾考察团常州包车服务全攻略:中英文司机、专业路线与高效接待方案 接待来自欧洲的商务考察团,是一项既...
住进桃花源,开心过大年!传统庙... 三湘都市报2月13日讯(全媒体记者 曾冠霖)逛庙会、看演艺、品非遗、住民宿、吃团年饭……这个春节假期...
逛起来!济南9个公园景区,推出... 新春将至,今年春节可以怎样嗨游济南?新黄河记者从济南市公园发展服务中心获悉,今年济南千佛山风景名胜区...
原创 广... 说起中国的宜居、养老之城,我们通常想到的都是云南的大理、昆明甚至是西双版纳,北方城市中的烟台和威海也...