【刷题之路】LeetCode 2389. 和有限的最长子序列

news2025/1/22 9:07:47

【刷题之路】LeetCode 2389. 和有限的最长子序列

  • 一、题目描述
  • 二、解题
  • 1、方法——二分法
    • 1.1、思路分析
    • 1.2、代码实现

一、题目描述

原题连接: 2389. 和有限的最长子序列
题目描述:
给你一个长度为 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

二、解题

1、方法——二分法

1.1、思路分析

由题目描述我们可知,对于每个queries[i],我们都需要找到一个子序列,使得该子序列的元素之和不超过queries[i],
且要使得该子序列的长度最大化,很显然,我们应该尽量选择较小的元素,这样才能使得子序列的长度最大化。
所以我们可以先对nums数组进行排序,然后使用一个数组f来保存nums数组的前缀和,f[i]保存的是数组nums从下标位0到下标位i - 1的元素的和:
在这里插入图片描述
所以f数组的长度要比nums数组的长度要大1。
然后我们顺序遍历queries数组,对于每个queries[i],都使用二分查找法在f数组中查找到第一个大于queries[i]的元素,
如果该元素的下标为x,那么x - 1就为对应的最长子序列的长度

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

// 先写一个函数,比较两个整数的大小
int cmp_int(const void* p1, const void* p2) {
	assert(p1 && p2);
	return *((int*)p1) - *((int*)p2);
}

// 再写一个二分查找算法
int binary_search(int left, int right, int* nums, int target) {
	assert(nums);
	int mid = 0;
	while (left < right) {
		if (nums[left] > target) {
			return left;
		}
		mid = left + (right - left) / 2;
		if (nums[mid] <= target) {
			left = mid + 1;
		}
		else {
			right = mid;
		}
	}
	return left;
}

int* answerQueries(int* nums, int numsSize, int* queries, int queriesSize, int* returnSize) {
	assert(nums && queries && returnSize);
	// 先对nums数组进行排序
	qsort(nums, numsSize, sizeof(int), cmp_int);
	int* answer = (int*)malloc(queriesSize * sizeof(int));
	*returnSize = queriesSize;
	if (NULL == answer) {
		perror("malloc");
		return NULL;
	}
	int* f = (int*)malloc((numsSize + 1) * sizeof(int));
	if (NULL == f) {
		perror("malloc");
		return NULL;
	}
	int i = 0;
	int j = 0;
	int sum = 0;
	// 求前缀和
	for (i = 0; i < numsSize + 1; i++) {
		f[i] = sum;
		if (i < numsSize) {
			sum += nums[i];
		}
	}
	for (i = 0; i < queriesSize; i++) {
		answer[i] = binary_search(0, numsSize + 1, f, queries[i]) - 1;
	}
	free(f);
	f = NULL;
	return answer;
}

时间复杂度:O((n+m)logn),其中n为数组nums的长度,m为数组queries的长度,对数组nums进行排序的复杂度为nlogn,二分查找的复杂度为logn,故总的时间复杂度为O((n+m)logn)。
空间复杂度:O(n + m)。我们总共需要n + m + 1个额外空间,故空间复杂度为O(n + m)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UR5构型机械臂正逆运动学

前言 整理之前的一个项目&#xff0c;当时看着一个博客硬生生计算了差不多一个星期。尝试用MatLab符号推导工具箱化简一部分工作。我使用的大象机器人一款开源入门级协作机器人产品myCobot&#xff0c;开发文档十分完善&#xff0c;但是有部分技术没有开源&#xff0c;如正逆运…

数据分析师 ---- SQL强化(2)

数据分析师 ---- SQL强化(2) 文章目录数据分析师 ---- SQL强化(2)题目一&#xff1a;SQL实现文本处理题目二&#xff1a;语种播放量前三高所有歌曲总结&#xff1a;题目一&#xff1a;SQL实现文本处理 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,…

钢铁侠材质制作——2、线条轮廓部分的制作

钢铁侠Unlit光照Shader&#xff0c;三种效果变化返回目录大家好&#xff0c;我是阿赵&#xff0c;这里是钢铁侠材质制作第二部分&#xff0c;线条轮廓部分的制作 为了实现这个效果&#xff0c;可以把细节拆分成以下几个部分&#xff1a; 1、轮廓光 1.效果分析 这是一个很基…

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention时间序列预测&#xff0c;CNN-BiLSTM结合注意力机制时间序列预…

语言模型ChatGPT,为什么能引领各行各业的AI技术革命

为什么ChatGPT这样一个语言模型的发展能引发所有行业的AI技术革命呢&#xff1f; 答案就在于它能理解我们的自然语言&#xff0c; 并能将我们的语言转换成计算机能够完全理解的特征。 自然语言与计算机理解 ChatGPT之所以能引领技术革命&#xff0c;关键在于它能理解我们的…

GPT、科技、人类的生产、知识与未来(上)

本文将继续结合GPT探讨人工智能技术升级可能对人类社会带来的影响。主要还是侧重历史、社会、文化、经济、政治等角度。 问题的提出&#xff1a;ChatGPT等工具会提高人的工作效率和产出。但它会让人类使用者自身变得更“聪明”&#xff0c;还是“更笨”&#xff1f;更“强”&am…

CVE-2017-16995 Ubuntu 16.04 漏洞复现

目录 1.背景介绍 2.目的&#xff1a; 3.环境 4.操作&#xff1a; 工具下载地址&#xff1a; 1.背景介绍 Ubuntu 16.04版本存在本地提权漏洞&#xff0c;该漏洞存在于Linux内核带有的eBPF bpf(2)系统调用中&#xff0c;当用户提供恶意BPF程序使eBPF验证器模块产生计算错误&…

JDBC03-批处理、连接池、DBUtils、事物、DAO通用方法

1. 封装 JDBCUtils 【关闭、得到连接】 1.1 说明 1.2 代码实现 工具类 JDBCUtils package com.hspedu.jdbc.utils;import java.io.FileInputStream; import java.io.IOException; import java.sql.*; import java.util.Properties; /** * 这是一个工具类&#xff0c;完成 my…

【Microsoft Edge】安装详解

文章目录一、下载 Edge1.1 下载网址1.2 版本分类二、安装 Edge2.1 可能的异常情况2.2 安装目录详解2.2.1 Edge 非 Canary 版2.2.2 Edge Canary 版一、下载 Edge Edge 的安装包其实是一个简易安装包&#xff0c;里面封装了一个安装的配置文件&#xff0c;提供真正的安装包下载链…

FreeRTOS 任务基础知识

文章目录一、什么是多任务系统&#xff1f;二、FreeRTOS 任务与协程三、任务状态四、任务优先级五、任务实现六、任务控制块七、任务堆栈RTOS 系统的核心就是任务管理&#xff0c;FreeRTOS 也不例外&#xff0c;而且大多数学习 RTOS 系统的工程师或者学生主要就是为了使用 RTOS…

Revit中怎么绘制多面坡度的屋顶及生成墙

​一、Revit中怎么绘制多面坡度的屋顶 像这种坡屋顶我们可以观察到&#xff0c;它的屋顶轮廓都是带有坡度的&#xff0c;那我可以通过添加定义坡度的方式来绘制出该屋顶。 点击建筑选项卡中的屋顶按钮&#xff0c;选择迹线屋顶。 选择使用拾取线工具&#xff0c;在选项栏中将偏…

从零学习SDK(4)使用SDK创建一个简单的应用程序

SDK&#xff08;Software Development Kit&#xff09;即软件开发工具包&#xff0c;是一组帮助我们开发出软件的工具&#xff0c;包括代码、文档、示例等。一般情况下&#xff0c;我们需要将SDK引入到我们的项目中才能使用它。比如&#xff0c;学Java的朋友最早接触的JDK&…

JMeter使用JDBC Request取样器 获取查询结果

JDBC获取查询结果Java脚本创建文件JSON字符串解析 数据库连接配置定义全局变量JDBC Request 创建文件路径以及文件的脚本 import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; boolean result false; try {//String message new Si…

JAVA初学下(仅做笔记)

一. Map集合&#xff08;双列集合&#xff09; 1.特点 键不能重复&#xff0c;值可以重复 Map接口位于最高层 2.常见API 2.1基本功能 ①注意V put&#xff08;K key,V value&#xff09;这个方法&#xff0c; 当加入 的键值对元素的键(key) 不存在时&#xff0c;就会将 键值…

django项目名称重命名

学会这个小白也能轻松修改项目名称;日常板砖中难免遇到项目多次利用的情况,修改项目名称也成了一门手艺😀;实际操作起来也非常简单,没有那些花花绿绿的东西. 一.项目奔跑 1.拿到项目后,我们先在pycharm运行下,看项目是否能正常奔跑起来; 注意收集正常奔跑后项目的执行环境等…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?...

高薪能买来快乐吗&#xff1f;来看看这位程序员的哀叹&#xff1a;实在是扛不住了&#xff0c;每天都在极度焦虑和痛苦中度过&#xff0c;早上起来要挣扎着做心理建设去上班&#xff0c;已经产生生理性的头晕恶心食欲不振。有工作本身的原因&#xff0c;更多是自己心态的问题&a…

12纳米做出了7纳米的性能,为国产芯片打破美国限制指明道路

美国联合日本、荷兰等限制对中国供应先进芯片设备&#xff0c;试图借此阻止中国发展14纳米以下的先进工艺&#xff0c;然而日前中国一家芯片企业发布了一款全新的芯片&#xff0c;却给中国芯片行业指明了新道路&#xff0c;发展先进性能芯片又了可能性。龙芯近期发布了一款全新…

Flink 优化 (四) --------- 数据倾斜

目录一、判断是否存在数据倾斜二、数据倾斜的解决1. keyBy 后的聚合操作存在数据倾斜2. keyBy 之前发生数据倾斜3. keyBy 后的窗口聚合操作存在数据倾斜一、判断是否存在数据倾斜 相同 Task 的多个 Subtask 中&#xff0c;个别 Subtask 接收到的数据量明显大于其他Subtask 接收…

【DevOps】GitOps之痛 -不完美的GitOps

前言 在前两篇文章中&#xff0c;我们对GitOps进行了大致的介绍&#xff1a; 【DevOps】GitOps初识(上) - 让DevOps变得更好 【DevOps】GitOps初识(下) - 让DevOps变得更好 GitOps 作为软件发布实践方式&#xff0c;有着许多的优点&#xff0c;然而&#xff0c;世上并没有完美…

【Linux】Centos安装mvn命令(maven)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录一、下载maven包方法一&#xff1a;官…