LeetCode 2389. 和有限的最长子序列
【LetMeFly】2389.和有限的最长子序列
力扣题目链接:https://leetcode.cn/problems/longest-subsequence-with-limited-sum/
给你一个长度为 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
方法一:前缀和 + 二分
这道题要的是“子序列”。什么意思?意思就是随便删除数组中的元素,不必保证连续。
那么想要尽可能多的数字的和不超过q
,当然是要这些数字尽可能地小。
因此我们给原数组中的元素从小到大排序,再使用前缀和的方法令nums[i]
为“nums[0]到nums[i]的元素和”。
这样,我们在寻找“和不超过q
”的最长序列时,只需要二分找到nums
中最后一个不大于q
的元素的位置,这就说明排过序的nums数组中这个元素及其之前的所有元素的和不超过q
,且这是最后一个满足上述条件的位置。
这个位置即为所求。
- 时间复杂度 O ( l e n ( n u m s ) × log l e n ( n u m s ) + l e n ( q u e r i e s ) × log l e n ( n u m s ) ) O(len(nums)\times \log len(nums) + len(queries)\times\log len(nums)) O(len(nums)×loglen(nums)+len(queries)×loglen(nums)),排序的时间复杂度是 O ( l e n ( n u m s ) × log l e n ( n u m s ) O(len(nums)\times \log len(nums) O(len(nums)×loglen(nums),每次查找的时间复杂度是 O ( log l e n ( n u m s ) ) O(\log len(nums)) O(loglen(nums))
- 空间复杂度 O ( log l e n ( n u m s ) ) O(\log len(nums)) O(loglen(nums)),这里我们修改了 n u m s nums nums数组和 q u e r i e s queries queries数组,只是排序时用到了 O ( log l e n ( n u m s ) ) O(\log len(nums)) O(loglen(nums))的空间
AC代码
C++
class Solution {public:vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {sort(nums.begin(), nums.end());for (int i = 1; i < nums.size(); i++) {nums[i] += nums[i - 1];}for (int& q : queries) {q = upper_bound(nums.begin(), nums.end(), q) - nums.begin();}return queries;}
};
Python
# from typing import List
# import bisectclass Solution:def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:nums.sort()for i in range(1, len(nums)):nums[i] += nums[i - 1]for i, q in enumerate(queries): # 这里for q in queries的话,修改q是不会修改queries中的值的queries[i] = bisect.bisect_right(nums, q)return queries
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/129618747
LeetCode 2389. 和有限的最长子序列相关推荐
- LeetCode 1615. 最大网络秩 / 2389. 和有限的最长子序列 / 1626. 无矛盾的最佳球队(排序+动态规划)
1615. 最大网络秩 2023.3.15 每日一题 题目描述 n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络.每个 roads[i] = [ai, bi] 都表示在城市 a ...
- 【2389. 和有限的最长子序列】
来源:力扣(LeetCode) 描述: 给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries . 返回一个长度为 m 的数组 answer ,其中 answer[i ...
- LeetCode # 524 字符串中最长子序列
给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空字符串. 示例 ...
- LeetCode简单题之最长特殊序列 Ⅰ
题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 .如果不存在,则返回 -1 . 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) ...
- 单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列
最长公共子序列 的 算法思路 在这里 点击进入 将 代码稍微改动一下 就可以 , 最长公共子序列 是两个 字符串求 公共子序列 , 可以将其中的 一个 改为 从 a 到 z 这样输入另 ...
- 动态规划之-----单调递增最长子序列(nyoj17)
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行 ...
- 24-单调递增最长子序列(多种解法总结)
单调递增最长子序列 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 时间限制:3000 ms | 内存限制:65535 KB 难度:4 ...
- C语言实现最长子序列 longest subsequence 算法(附完整源码)
最长子序列 longest subsequence 算法 C语言最长子序列 longest subsequence 算法完整源码(定义,实现,main函数测试) C语言最长子序列 longest su ...
- C#LeetCode刷题之#521-最长特殊序列 Ⅰ(Longest Uncommon Subsequence I)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3949 访问. 给定两个字符串,你需要从这两个字符串中找出最长的特 ...
最新文章
- C++:rand()函数和srand()函数解读
- python中按钮关联两个函数_两个函数,在一个函数运行的情况下,点击按钮运行第二个...
- ckeditor缺少图像源文件地址_微软的模拟飞行带你开着飞机浏览世界附下载地址...
- RocketMQ 4.5.1 双主双从异步复制环境搭建
- TCP和UDP是否可以绑定同一端口进行通信
- java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法
- modelsim与modelsim_altera使用的一些区别
- Sqlserver中char,nchar,varchar与Nvarchar的区别
- Java开发环境!为什么MySQL不推荐使用uuid作为主键
- docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
- JSK-383 是否闰年(课后)【入门】
- 在MacOS系统中如何自定义屏幕保护程序?
- 拓端tecdat|把握出租车行驶的数据脉搏 :出租车轨迹数据给你答案!
- VS2015安装Visual C++的Win32控制台应用程序
- 使用turtle绘图:绘制“点“:dot()绘制“标记“:stamp()
- [C#] C#深入浅出4th Edition [2]
- HTML页面为什么设置了UTF-8仍然中文乱码
- SDNFV Fest论坛成功举办 全景展现SDN/NFV测试成果
- Linux 各种安装包
- 解析rtf格式的文件数据