1673. 找出最具競爭力的子序列

題目

給定一個整數數組 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.pswp.cn/web/13996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13996.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 刪除特殊字符 表中存了特殊字符 換行符 回車符 word字符 查詢不到

省流&#xff1a; UPDATE t1 SET f1 REPLACE(REPLACE( f1 , CHAR(10), ), CHAR(13), ); 用 replace() 函數將 換行符char(10) 和 回車符char(13) 替換為空字符串。 char(10)&#xff1a;換行 char(13)&#xff1a;回車 發現表里存進很多換行符&#xff0c;如下圖&#xff1a…

深入研究Qt Meta - Object System

目錄 先說RTTI 再說QMeta Object System 關于Q_OBJECT 這篇文章我打算研究一下QMetaObject System&#xff0c;也就是Qt自己構建起來的元對象系統。 先說RTTI 啥是RTTI&#xff1f;這是C編程里的一個常見術語&#xff0c;全稱是&#xff1a;運行階段類型識別&#xff08;Ru…

Chrome DevTools攻略

Chrome DevTools&#xff0c;也稱為Chrome開發者工具&#xff0c;是一套直接內置于Google Chrome瀏覽器的Web開發者工具。以下是一些使用Chrome DevTools的攻略和技巧&#xff1a; 打開DevTools&#xff1a; 右鍵點擊頁面上的任何元素&#xff0c;選擇“檢查”或“審查元素”。…

2024年華為OD機試真題-機場航班調度程序-C++-OD統一考試(C卷D卷)

題目描述: XX市機場停放了多架飛機,每架飛機都有自己的航班號CA3385,CZ6678,SC6508等,航班號的前2個大寫字母(或數字)代表航空公司的縮寫,后面4個數字代表航班信息。但是XX市機場只有一條起飛用跑道,調度人員需要安排目前停留在機場的航班有序起飛。為保障航班的有序起…

【webrtc】MediaEngine的實現CompositeMediaEngine創建VOE

m98音視頻的引擎是管理channel的看起來是外部強加給CompositeMediaEngine 管理的。CompositeMediaEngine :合成媒體引擎 G:\CDN\rtcCli\m98\src\media\base\media_engine.h// CompositeMediaEngine constructs a MediaEngine from separate // voice and video engine classes…

Python中文分詞工具庫之jieba使用詳解

概要 在自然語言處理(NLP)領域,中文文本的分詞是一個重要且基礎的任務。Python的jieba庫是一個廣泛使用的中文分詞工具,提供了豐富的功能,包括精準模式、全模式、搜索引擎模式等,適用于不同的應用場景。本文將詳細介紹jieba庫,包括其安裝方法、主要特性、基本和高級功能…

代碼隨想錄35期Day49-Java

Day49題目 LeetCode123買賣股票三 核心思想:和昨天的買賣股票相比,這個只允許買兩次,因此把狀態新增幾個,可見代碼注釋 class Solution {public int maxProfit(int[] prices) {// 設置五個狀態 0 : 無操作 , 1 : 第一次買入, 2 : 第一次賣出 , 3: 第二次買入, 4:第二次賣出…

java技術:oauth2協議

目錄 一、黑馬程序員Java進階教程快速入門Spring Security OAuth2.0認證授權詳解 1、oauth服務 WebSecurityConfig TokenConfig AuthorizationServer 改寫密碼校驗邏輯實現類 2、oauth2支持的四種方式&#xff1a; 3、oauth2授權 ResouceServerConfig TokenConfig 4、…

前端面試題日常練-day19 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. AJAX是什么的縮寫&#xff1f; A. Asynchronous JavaScript and XMLB. Asynchronous JavaScript and XHTMLC. Asynchronous Java and XMLD. Asynchronous Java and XHTML2. 下列哪個方法用于創建…

SpringCloudAlibaba 動態讀取配置文件的信息

傳統讀取方式&#xff1a; 在application.properties中寫入要讀取的內容&#xff0c;如下&#xff1a; coupon.user.nameTom coupon.user.age27 接口引入處&#xff1a; Value("${coupon.user.name}")private String name;Value("${coupon.user.age}")p…

MySQL的索引是什么

MySQL的索引 一、索引概述二、索引結構1.簡要概述2.從二叉樹說起3.再在說下B-Tree4.為什么選擇BTree5.Hash又是什么6.博主被面試官經常問的題目 三、索引分類四、聚集索引&二級索引五、索引語法 一、索引概述 1.索引是幫助MySQL 高效獲取數據的數據結構(有序)。在數據之外…

[STM32-HAL庫]Flash庫-HAL庫-復雜數據讀寫-STM32CUBEMX開發-HAL庫開發系列-主控STM32F103C6T6

目錄 一、前言 二、實現步驟 1.STM32CUBEMX配置 2.導入Flash庫 3.分析地址范圍 4.找到可用的地址 5.寫入讀取普通數據 6.寫入讀取字符串 6.1 存儲相關信息 6.2 存取多個參數 三、總結及源碼 一、前言 在面對需要持久化存儲的數據時&#xff0c;除了掛載TF卡&#xff0c;我們…

燃數科技前端25-40K*14薪一面超簡單,下周二面啦

一面 1、自我介紹 2、低代碼如何設計的 3、react路由原理 4、react生命周期 5、什么是回調地獄&#xff0c;如何解決 6、jwt和session有什么區別 7、js文件相互引用有什么問題&#xff1f;如何解決 8、一個很大的json文件&#xff0c;前端讀取如何優化 面試我的不像是…

為什么說 Redis 是單線程的?——Java全棧知識(25)

為什么說 Redis 是單線程的&#xff1f; 我們常說的 Redis 是單線程的&#xff0c;但是我前面在講持久化機制的時候又說 RDB 的持久化是通過主進程 fork 出一個子進程來實現 RDB 持久化。那么 Redis 到底是多線程還是單線程的呢&#xff1f; Redis 的網絡 IO 和鍵值的讀寫是單…

力扣:1306. 跳躍游戲 III

1306. 跳躍游戲 III 這里有一個非負整數數組 arr&#xff0c;你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意&#xff0c;不管是什么情況下…

數據庫|基于T-SQL創建數據庫

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; SQL Server用于操作數據庫的編程語言為Transaction-SQL,簡稱T-SQL。 本節學習基于T-SQL創建數據庫。以下為學習筆記。 01 打開新建查詢 首先連接上數據庫&#xff0c;點擊【新建查詢】打開新建查詢窗口&#xff0c; …

appium-driver方法待整理。。

app C:\Users\v-hongweishi\AppData\Local\Programs\Xmind\Xmind.exe deviceName DESKTOP-7NJ1ENB platformName Windows 應用程序ID&#xff08;AppId&#xff09;是應用程序用戶模型 ID (AppUserModelID)&#xff0c;簡稱 AUMID Outlook …

Leetcode 113:路徑總和II

給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。 葉子節點 是指沒有子節點的節點。 public static List<List<Integer>> pathSum(TreeNode root, int targetSum) {List<List&l…

C++—結構體

結構體&#xff08;struct&#xff09;&#xff0c;是一種用戶自定義復合數據類型&#xff0c;可以包含不同類型的不同成員。 結構體的聲明定義和使用的基本語法&#xff1a; // 聲明結構體struct 結構體類型 { 成員1類型 成員1名稱; ...成員N類型 成員N名稱; };除聲明…

【計算機視覺(2)】

基于Python的OpenCV基礎入門——視頻的處理 視頻OpenCV視頻處理操作&#xff1a;創建視頻對象判斷視頻是否成功初始化讀取視頻幀獲取視頻特征設置視頻參數聲明編碼器保存視頻釋放視頻對象 視頻處理基本操作的代碼實現&#xff1a; 視頻 視頻是由一系列連續的圖像幀組成的。每一…