力扣2389.和有限的最长子序列(前缀和+二分法)

server/2024/12/17 15:32:38/

根据 灵茶山艾府 题解所写

题目描述:

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

 解题思路:

要求子序列的最大长度,子序列中的元素值越小越好

对于本题来说,我们计算的是元素和,所以元素在数组中的位置无关紧要,可以重新排序

将数组从小到大排序后,再从小到大选择尽量多的元素,相当于选择一个前缀,使这些元素的和不超过询问值。

代码实现:

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 i = 0; i < queries.length; i++) {queries[i] = upperBound(nums, queries[i]); // 复用 queries 作为答案}return queries;}// https://www.bilibili.com/video/BV1AP41137w7/// 返回 nums 中第一个大于 target 的数的下标(注意是大于,不是大于等于)// 如果这样的数不存在,则返回 nums.length// 时间复杂度 O(log nums.length)// 采用开区间写法实现private int upperBound(int[] nums, int target) {int left = -1, right = nums.length; // 开区间 (left, right)while (left + 1 < right) { // 区间不为空// 循环不变量:// nums[left] <= target// nums[right] > targetint mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid; // 范围缩小到 (left, mid)} else {left = mid; // 范围缩小到 (mid, right)}}return right;}
}


http://www.ppmy.cn/server/150937.html

相关文章

计算机网络 第六章 应用层

文章目录 1.域名系统DNS2.文件传送协议FTP2.1FTP概述2.2FTP的基本工作原理 3.万维网 1.域名系统DNS 域名系统 DNS(Domain Name System)是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器名字转换为IP地址 。 互联网的域名结构&#xff1a; 域名服务器 2.文件传…

跟着问题学19——BERT详解(2)

预训练策略 BERT模型的预训练基于两个任务&#xff1a; 屏蔽语言建模 下一句预测 在深入屏蔽语言建模之间&#xff0c;我们先来理解一下语言建模任务的原理。 语言建模 在语言建模任务中&#xff0c;我们训练模型给定一系列单词来预测下一个单词。可以把语言建模分为两类&…

dev类似于excel的数据编辑

其实这个不是我最后的结果&#xff0c;只是中间demo&#xff0c;因为我的场景数据量很大&#xff0c;2w左右&#xff0c;有数据合并&#xff0c;我更倾向于el-table是实现&#xff0c;但不想el-input一直显示&#xff0c;想用if-else 去做隐藏&#xff0c;但是用typetextarea发…

TypeScript学习路线图

‌ TypeScript 是由微软开发和维护的一种静态类型编程语言&#xff0c;它是 JavaScript 的超集。TypeScript 的创建是为了解决构建大规模 JavaScript 应用程序所面临的挑战&#xff0c;并向该语言添加了可选的类型注解、类、接口和其他特性。 使用 TypeScript 的主要好处包括&a…

记一次文件写入的优化

文件写入优化 现状 系统中需要大量的写入大文件&#xff0c;文件的大小从1.x Mb&#xff0c;到20Mb不等&#xff0c;但是每个文件夹下都有几十到几百个文件。原来采用的是Files.write的方式&#xff0c;将文件写入系统。但是在操作大量数据的时候感觉比较慢。 方案 尝试使用…

Python OpenCV按照像素点图片切割

图像分割是从图像处理到图像分析的关键步骤&#xff0c;在目标检测、特征提取、图像识别等领域具有广泛应用。OpenCV是一个强大的计算机视觉库&#xff0c;提供了多种图像分割方法。本文将详细介绍如何使用Python和OpenCV进行基于像素点的图像分割&#xff0c;包括阈值分割、自…

讯飞智文丨一键生成WordPPT

在当今数字化办公的浪潮中,Word和PPT已经成为职场人士日常工作的标配工具。然而,面对繁琐的内容编辑和格式调整任务,如何提升效率成了每个人的追求。而讯飞智文,一款结合人工智能技术的文字处理与演示文稿工具,正逐渐成为用户的得力助手。本文将详细介绍讯飞智文的功能特点…

Vue Web开发(八)

1. VueWeb面包屑和tag的布局 本章节完成VueWeb面包屑和tag的布局&#xff0c;并且与左侧菜单联系&#xff0c;涉及组件间通信。 1.1. 页面创建 &#xff08;1&#xff09;首先我们先完成每个页面的路由&#xff0c;之前已经有home页面和user页面&#xff0c;缺少mail页面和其…