【精品】【算法實戰】每日一題:如何用Python實現給定整數序列中尋找最小長度窗口以包含所有不同元素的算法?

問題:

如何用Python實現給定整數序列中尋找最小長度窗口以包含所有不同元素的算法?

核心思路

核心思路是利用雙端隊列(作為滑動窗口)來找到一個滿足特定條件的最小長度子序列。算法遍歷給定的序列,對于每個新數據點,執行以下三種操作之一:

  1. 如果數據點不在當前窗口中,則將其添加到隊列中(表示窗口擴展)。
  2. 如果數據點已存在于窗口中,但隊首和隊尾的元素不同(意味著窗口中尚需包含此元素),則仍然將其加入隊列。(損耗元素,知道有但是還是得加入)
  3. 如果數據點已存在,且隊首和隊尾的元素相同(表示該元素類型已滿足),則從隊列中移除隊首元素(縮短窗口)。

在遍歷過程中,維護一個記錄最小長度窗口的變量。如果當前窗口包含所有必需的不同元素類型,并且比之前記錄的任何窗口都小,則更新最小長度窗口的記錄。最終,得到一個滿足條件的最小長度窗口。

進一步給出偽碼思路

初始化一個雙端隊列 q 和一些計數器以及變量。定義主函數 main:讀取輸入的 n 和 m,分別代表數組長度和目標不同元素的數量。讀取數組 a 并將其轉換為整數列表。對數組 a 中的每個元素執行以下操作:如果當前元素的計數器 cnt 為 0,增加類型數量 type。增加當前元素的計數器。將當前索引添加到雙端隊列 q 的末尾。如果雙端隊列 q 不為空且隊首元素的計數器大于 1,移除隊首元素,直到計數器為 1。如果當前類型數量等于目標 m 且雙端隊列的長度小于當前記錄的最小長度 ans,則更新 ans 以及起始索引 l 和結束索引 r。打印出最小長度窗口的起始索引和結束索引,索引加 1(因為 Python 索引從 0 開始)。定義函數 qsize 來返回雙端隊列 q 的大小。如果這是主程序,調用 main 函數。

CODE


from collections import deque# 初始化變量
ans = float('inf')
n, m = 0, 0
a = []
cnt = [0] * 10000
l, r, type = 0, 0, 0
q = deque()def main():global ans, l, r, typen, m = map(int, input().split())a = list(map(int, input().split()))# 統計每個數出現的次數,并判斷是否需要type++for i in range(n):if cnt[a[i]] == 0:type += 1cnt[a[i]] += 1q.append(i)# 移除隊首元素,直到cnt[a[q[0]]]為0while q and cnt[a[q[0]]] > 1:cnt[a[q.popleft()]] -= 1# 如果type=m,且隊列長度<ans,則更新ans和l,rif type == m and qsize() < ans:ans = qsize()l = q[0]r = q[-1]print(l + 1, r + 1)  # 輸出時加1,因為Python索引從0開始def qsize():return len(q)if __name__ == '__main__':main()

注:

  1. ans = float('inf'):
    ans 變量用于存儲找到的滿足條件的最小長度子數組的長度。初始化為正無窮大(float('inf')),意味著我們從找一個非常大的長度開始,隨著算法的進行,如果找到更小的滿足條件的子數組,就會更新這個值。

  2. n, m = 0, 0:
    n 是數組 a 的長度,即數組中元素的總數。
    m 是我們需要在子數組中找到的不同元素的類型數。

  3. a = []:
    a 是一個空列表,稍后將用來存儲輸入的整數數組。

  4. cnt = [0] * 10000:
    cnt 是一個長度為 3000 的列表,用于計數。它將用于跟蹤數組 a 中每個元素的出現次數,10000因為測試用例可能比較大

  5. l, r, type = 0, 0, 0:
    lr 是子數組的起始和結束索引,初始化為 0。隨著算法的進行,它們將被更新為滿足條件的最小長度子數組的起始和結束索引。
    type 是一個計數器,用于跟蹤當前窗口中不同元素的類型數。

  6. q = deque():
    q 是一個 deque(雙端隊列)實例,它將被用作滑動窗口的數據結構。雙端隊列允許我們從兩端快速添加和刪除元素,非常適合實現滑動窗口。

END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14896.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14896.shtml

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

相關文章

【Spring】Spring框架對RESTFul風格的支持

1、簡介 Spring框架對RESTful風格的支持主要體現在Spring MVC和Spring Boot等模塊中。RESTful&#xff08;Representational State Transfer&#xff0c;表述層資源狀態轉移&#xff09;是一種軟件架構風格&#xff0c;它強調資源&#xff08;通常是網絡上的信息&#xff09;的…

Java方法的基本用法

Java方法的基本用法 前言一、什么是方法方法存在的意義示例 二、方法定義語法基本語法代碼示例注意事項 三、方法調用的執行過程基本規則代碼示例計算兩個整數相加計算 1! 2! 3! 4! 5! 四、實參和形參的關系代碼示例交換兩個整型變量原因分析解決辦法 五、沒有返回值的方法…

初識java——javaSE (6)接口的實現——比較器與深拷貝,淺拷貝

文章目錄 前言一 比較器1.1 關于兩個對象的比較1.2 Comparable接口&#xff1a;1.3 Arrays.sort方法的實現1.4 比較器的實現Comparator接口 二 深拷貝與淺拷貝2.1 淺拷貝&#xff1a;Cloneable接口&#xff1a;clone方法&#xff1a;實現拷貝&#xff1a;淺拷貝&#xff1a; 2.…

Python3 筆記:Python的所有關鍵字

查看Python的關鍵字首先需要用import導入keyword模塊 import keyword # 查看Python的所有關鍵字&#xff0c;先用import導入keyword模塊 print(keyword.kwlist) 運行結果&#xff1a; [False, None, True, and, as, assert, async, await, break, class, continue, def, …

MQ如何保證消息不丟失

MQ如何保證消息不丟失 問題分析具體分析及解決方案RabbitMQ生產者RabbitMQ配置消費者 KafkaKafka配置消費者 問題分析 從Kafka和RabbitMQ進行分析&#xff0c;MQ消息丟失的情況有生產者推送消息時數據丟失&#xff0c;MQ中間件宕機情況下數據丟失&#xff0c;消費者消費時消息…

GoLand map中的并發問題——為什么會造成并發問題?該怎么解決?

GoLand map中的并發問題——為什么會造成并發問題&#xff1f;該怎么解決&#xff1f; 問題提出原因解析具體原因競態檢測器 如何解決并發問題呢&#xff1f;方法一 &#xff1a; 使用sync.Mutex方法二&#xff1a; 使用sync.Map我們首先了解一下sync.Map的常用方法&#xff1a…

2024.5.24.python.exercise

# python文件操作 # f open("打字版.txt", "a", encoding"UTF-8") # writer input("請輸入你想要寫入到文件的內容") # f.write(writer) # f.flush() # f.close() # f open("打字版.txt", "r", encoding"…

代碼隨想錄算法訓練營第三十九天 | 738.單調遞增的數字、968.監控二叉樹 (可以跳過)

監控二叉樹同樣的等代碼隨想錄刷完后&#xff0c;再回頭來看&#xff0c;先跳過 738.單調遞增的數字 代碼隨想錄 解題思路 例如&#xff1a;98&#xff0c;一旦出現strNum[i - 1] > strNum[i]的情況&#xff08;非單調遞增&#xff09;&#xff0c;首先想讓strNum[i - 1]--…

游戲引擎支持腳本編程的好處

哈嘍呀&#xff0c;大家好&#xff0c;淼淼又來和大家見面啦&#xff0c;咱們今天來聊聊游戲引擎&#xff0c;游戲引擎作為現代游戲開發的核心&#xff0c;它集成了圖形渲染、物理模擬、音頻處理、動畫系統、輸入輸出控制等多種復雜技術于一體&#xff0c;為開發者提供了一個高…

ASP+ACCESS基于WEB網上留言板

摘要 本文概述了ACCESS數據庫及其相關的一些知識&#xff0c;著重論述ACCESS數據庫和ASP的中間技術&#xff0c;構建一個簡單的留言板。具體的實現是構造一個留言板系統&#xff0c;能很方便的和同學溝通和交流。留言板具有功能強大、使用方便的特點。用戶以個人的身份進入&am…

瑞芯微RV1126——人臉識別源碼分析

本節內容主要分為3部分&#xff0c;第一部分是流程結構圖;第二部分為人臉識別代碼流程;第三部分為具體的代碼分析。 1.流程結構圖 2.人臉識別代碼流程 1、人臉數據的初始化&#xff1a; init_all_rockx_face_data();init_face_data();2、創建rtsp會話&#xff0c;這里包括發…

一個典型的分布式緩存系統是什么樣的?no.32

分布式 Redis 服務 由于本課程聚焦于緩存&#xff0c;接下來&#xff0c;我將以微博內的 分布式 Redis 服務系統為例&#xff0c;介紹一個典型的分布式緩存系統的組成。 微博的 Redis 服務內部也稱為 RedisService。RedisService 的整體架構如圖所示。主要分為Proxy、存儲、集…

產品推薦 | 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

一、板卡概述 本板卡系我公司自主研發&#xff0c;采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作為主處理器&#xff0c;主要用于FPGA硬件加速。板卡設計滿足工業級要求。如下圖所示&#xff1a; 二、功能和技術指標 板卡功能 參數內容 主處理器 XCKU115-3-FLVF1924-E 板卡…

UE4/UE5像素流送云推流:多人訪問不穩定、畫面糊、端口占用多等

UE4/UE5想要實現網頁訪問&#xff0c;很多工程師會選擇guan方的像素流送。但這個技術要求在模型開發初期就接入。對于一些已有UE模型是無法進行流化的。雖然也可以解決新UE模型的網頁訪問問題&#xff0c;但在實際的應用中&#xff0c;點量云流也收到很多反饋說&#xff0c;使用…

netty-socketio 集群隨記

實現netty-socketio集群的方式 代碼實例 PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}"…

Python爬取B站視頻:封裝一下

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??如遇文章付費&#xff0c;可先看…

大數據Hadoop之-工具HIVE(一)

大數據Hadoop之——數據倉庫Hive HIVE介紹Hive是基于Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW),可以將結構化的數據文件映射為一張數據庫表,并提供類SQL查詢功能。是用于存儲、分析、報告的數據系統。 在Hadoop生態系統中,HDFS用于存儲數據,Yarn用于資源管理…

解釋Spring Bean的生命周期

Spring Bean的生命周期涉及到Bean的創建、配置、使用和銷毀的各個階段。理解這個生命周期對于編寫高效的Spring應用和充分利用框架的功能非常重要。下面是Spring Bean生命周期的主要步驟&#xff1a; 1. 實例化Bean Spring容器首先將使用Bean的定義&#xff08;無論是XML、注…

使用Golang調用騰訊云郵件模版發送郵件

文章目錄 一、騰訊云郵件模版創建1.1 發信域名配置1.2 發信地址設置1.3 發信模版設置 二、通過Golang發送郵件2.1 代碼示例2.2 代碼說明 三、常見問題3.1 UnsupportedRegion3.2 InvalidTemplateID 本文檔介紹了如何使用Golang編寫代碼&#xff0c;通過騰訊云郵件服務&#xff0…

【Linux】中的常見的重要指令(中)

目錄 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多參數&#xff0c;我們不可能全記住&#xff0c;我們可以通過查看聯機手冊獲取幫助。訪問Linux手冊頁的命令是 man 語法: m…