1673. 找出最具竞争力的子序列

news2024/9/20 8:06:09

题目

给定一个整数数组 nums 和一个正整数 k,返回长度为 k 且最具竞争力的 nums 子序列。

数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。

在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具竞争力。例如,[1,3,4][1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上,4 小于 5

示例

示例 1:

输入:nums = [3,5,2,6], k = 2

输出:[2,6]

解释:在所有可能的子序列集合 [{3,5}, {3,2}, {3,6}, {5,2}, {5,6}, {2,6}] 中,[2,6] 最具竞争力。

示例 2:

输入:nums = [2,4,3,3,5,4,9,6], k = 4

输出:[2,3,3,4]

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 109
  • 1 <= k <= nums.length

思路

为了找到最具竞争力的子序列,我们可以使用单调栈(Monotonic Stack)的策略。单调栈是一种保持元素顺序的栈结构,在这个问题中,我们需要维护一个递增栈,以确保子序列的最小化竞争力。

主要思路如下:

  1. 遍历数组 nums,并在每一步中确保栈中的元素保持递增顺序。
  2. 如果当前元素比栈顶元素小,并且栈中的元素数目加上剩余的元素数目大于 k,则弹出栈顶元素。
  3. 将当前元素入栈,前提是栈的大小小于 k

mostCompetitive函数

int* mostCompetitive(int* nums, int numsSize, int k, int* returnSize) {
    *returnSize = k;
    int* res = (int*)malloc(sizeof(int) * k);
    int top = -1;  // 栈顶指针,表示当前子序列的最后一个元素的位置

    for (int i = 0; i < numsSize; i++) {
        // 如果当前元素比栈顶元素小,并且栈中元素数目加上剩余的元素数目大于k,则弹出栈顶元素
        while (top >= 0 && nums[i] < res[top] && top + numsSize - i > k - 1) {
            top--;
        }
        // 如果当前栈的大小小于k,则将当前元素入栈
        if (top < k - 1) {
            res[++top] = nums[i];
        }
    }

    return res;
}

returnSize 用于记录返回数组的大小,并将其设置为 k。
为存储最终结果的数组 res 分配了 k 个整数的内存空间。
top 初始化为 -1,表示栈为空,后续将用于指示栈顶元素的位置。

时间复杂度分析

  • for 循环: 该循环遍历了整个输入数组 nums,时间复杂度为 O(n),其中 n 是数组 nums 的长度。

  • while 循环: 在每次遍历中,while 循环最多执行栈中元素的数量(最多 k 次),因为每次循环都可能将栈顶元素弹出,最多进行 k 次操作。在最坏情况下,每个元素都需要进栈或出栈一次,所以 while 循环的总体时间复杂度为 O(n)。

综上所述,代码的总体时间复杂度为 O(n)。

空间复杂度分析

  • res 数组: 空间复杂度为 O(k),其中 k 是返回数组的大小,也是最终结果数组的长度。

  • top 变量: 使用了一个整数变量来表示栈顶指针,不占用额外的空间,因此空间复杂度为 O(1)。

综上所述,代码的总体空间复杂度为 O(k)。

这段代码的时间复杂度是线性的,因为它只对输入数组进行了一次线性遍历。而空间复杂度取决于返回数组的大小 k

结果

结果

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

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

相关文章

【C语言】结构体内存对齐:热门面试话题

&#x1f525;引言 书接上文&#xff0c;我们了解关于结构体的基本知识&#xff0c;这篇将深入剖析结构体中一个重要的知识点:内存对齐 关于内存对齐是属于热门面试话题&#xff0c;对此单独放在一篇来分享 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记…

uniapp宠物咖门店连锁会员制宠物寄养系统 微信小程序-

随着人们生活水平的提高&#xff0c;越来越多的人喜欢给自己或是家里的老人小孩养一只可爱的宠物&#xff0c;满足宠物的需要也就成为了许多爱宠人士每天苦恼的事情&#xff0c;去哪可以选购到健康合格的宠物食品&#xff1f;去哪能给宠物看病&#xff1f;去哪能给脏了的宠物美…

Nat Hum Behav | 人类前额叶皮层非空间注意力的因果相位依赖性控制

摘要 非空间注意力是一种基本的认知机制&#xff0c;它使个体能够将意识的焦点从无关刺激转向与行为目标相关的感觉信息上。有人提出了一种关于注意力是由前额叶皮层中缓慢兴奋性波动的持续相位所调节的假设&#xff0c;但这一假设存在争议且尚未达成共识。在这里&#xff0c;…

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备&#xff0c;本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作&#xff0c;具有毫秒级响应速度。该工具可广泛用于电脑控…

亚信安慧AntDB数据库采集技术创新:ACC从Java到Go的转型之路

传统的指标采集方法通常使用一些命令行工具&#xff0c;如top、free等来获取系统的性能数据。然而&#xff0c;这种方法存在一些缺点。首先&#xff0c;这些命令行工具输出的数据格式通常是文本形式&#xff0c;需要进行解析和处理才能得到有用的信息&#xff0c;这增加了开发者…

【深度学习】加速采样生成图像——DDIM原理解析

文章目录 1、前言2、DDPM回顾及为何不能跳步采样2.1、回顾2.2、从DDPM的目标函数视角上看&#xff0c;为什么无法跳步采样&#xff1f;2.3、DDPM的困境 3、DDIM3.1、马尔可夫假设3.2、跳步采样构造3.3、DDIM的目标函数3.4、求解目标函数3.4.1、设定逆扩散过程3.4.2、求解KL散度…

企业级内网穿透(神卓互联)

神卓互联内网穿透采用自主研发的 WanGooe Tunnel 第九代核心引擎&#xff0c;拥有高级别用户访问权限验证&#xff0c;无授权将无法访问项目&#xff0c;地域限制&#xff0c;可灵活设置仅限某个地区可以访问 项目&#xff0c;保障数据传输安全采用&#xff0c;端到端加密&…

【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示

进度条控制脚本&#xff0c;支持节点进度条&#xff0c;图片进度条&#xff0c;进度条组件&#xff0c;和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…

Windows:iHasher-v0.2安装报错Windows 功能 .NET Framework 3.5

一、情景描述 我们从MSDN下载了镜像文件&#xff0c;一般要验证下载文件的HASH值是否与MSDN上发布的一致&#xff0c;确保传出过程中iso文件没有损坏。 MSDN地址&#xff1a;https://msdn.itellyou.cn/ 我从MSDN下载了Hasher工具&#xff0c;进行校验。 但是&#xff0c;安装…

js 面试题学习笔记一

1、什么是防抖和节流&#xff1f;有什么区别&#xff1f;如何实现&#xff1f; 防抖&#xff1a;触发高频事件后N秒内函数只会执行一次&#xff0c;如果N秒高频事件再次被触发&#xff0c;则重新计算时间。&#xff08;a时间触发&#xff0c;5秒内执行一次&#xff0c;但是第4…

【代码随想录】【算法训练营】【第16天】 [104]二叉树的最大深度 [111]二叉树的最小深度 [222]完全二叉树的节点个数

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 16&#xff0c;周四&#xff0c;再坚持一下吧~ 题目详情 [104] 二叉树的最大深度 题目描述 104 二叉树的最大深度 解题思路 前提&#xff1a;二叉树的最大深度&#xff0c;等价于二叉树的层…

C#读取.sql文件并执行文件中的sql脚本

有些时候我们需要在程序中编写读取sql脚本文件并执行这些sql语句&#xff0c;但是我们在有些时候会遇到读出来的sql语句不能执行&#xff0c;其实不能执行并不是你的sql脚本文件有错误&#xff0c;而是去执行sql语句的时候&#xff0c;C#代码里面执行sql语句的代码对sql里面的一…

新书推荐:6.2 else if语句

本节必须掌握的知识点&#xff1a; 示例代码二十 代码分析 汇编解析 ■if语句表达形式3 if(表达式1) statement1 else if(表达式2) statement2 else if(表达式3) statement3 …… else statementN 解析&#xff1a; 如果表达式1非0&#xff0c;则执行statement1&#…

基于Netty实现WebSocket服务端

本文基于Netty实现WebSocket服务端&#xff0c;实现和客户端的交互通信&#xff0c;客户端基于JavaScript实现。 在【WebSocket简介-CSDN博客】中&#xff0c;我们知道WebSocket是基于Http协议的升级&#xff0c;而Netty提供了Http和WebSocket Frame的编解码器和Handler&#…

9.3 Go语言入门(变量声明和函数调用)

Go语言入门&#xff08;变量声明和函数调用&#xff09; 目录二、变量声明和函数调用1. 变量声明1.1 使用 var 关键字声明1.2 简短声明1.3 零值1.4 常量 2. 函数调用2.1 函数定义2.2 多个返回值2.3 命名返回值2.4 可变参数2.5 匿名函数和闭包 目录 Go 语言&#xff08;Golang&a…

Windows11下使用Qt5.14.2编译QtXlsx驱动详细步骤

原有&#xff1a;由于系统需要将QTableWidget表格中的数据导出、在Windows下最开始使用Excel.Application组件实现了导出功能&#xff0c;后面将代码转换到Ubuntu20.04下进行编译&#xff0c;发现项目.pro文件中的QT axcontainer和代码.h文件中的#include <QAxObject>跟…

接口自动化基础

1、接口自动化测试 接口自动化&#xff1a;使用工具或代码代替人对接口进行测试的技术。 测试目的&#xff1a;防止开发修改代码时引入新的问题。 l测试时机&#xff1a; 开发进行系统测试转测前&#xff0c;可以先进行接口自动化脚本的编写。 开发进行系统测试转测后&…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下&#xff1a; package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

燃数科技前端25-40K*14薪一面超简单,下周二面啦

一面 1、自我介绍 2、低代码如何设计的 3、react路由原理 4、react生命周期 5、什么是回调地狱&#xff0c;如何解决 6、jwt和session有什么区别 7、js文件相互引用有什么问题&#xff1f;如何解决 8、一个很大的json文件&#xff0c;前端读取如何优化 面试我的不像是…