算法-每日一題(DAY12)最長和諧子序列

1.題目鏈接:

594. 最長和諧子序列 - 力扣(LeetCode)

2.題目描述:

和諧數組是指一個數組里元素的最大值和最小值之間的差別?正好是?1?。

給你一個整數數組?nums?,請你在所有可能的?子序列?中找到最長的和諧子序列的長度。

數組的?子序列?是一個由數組派生出來的序列,它可以通過刪除一些元素或不刪除元素、且不改變其余元素的順序而得到。

示例 1:

輸入:nums = [1,3,2,2,5,2,3,7]輸出:5

解釋:

最長和諧子序列是?[3,2,2,2,3]

示例 2:

輸入:nums = [1,2,3,4]輸出:2

解釋:

最長和諧子序列是?[1,2][2,3]?和?[3,4],長度都為 2。

示例 3:

輸入:nums = [1,1,1,1]輸出:0

解釋:

不存在和諧子序列。

提示:

1 <= nums.length <= 2 * 104
-109 <= nums[i] <= 109

3.解題思路:

我們可以通過哈希表的方式,利用元素頻率統計來求解數組中的最長和諧子序列。首先,創建一個哈希表 cnt 來記錄每個數字在數組中的出現頻次。接著,遍歷 nums 數組,對于每一個數字 num,將其在 cnt 中的計數加 1。然后,遍歷哈希表中的每一個鍵值對,檢查是否存在一個比當前鍵大 1 的數字。如果存在這樣的數字,說明這兩個數字可以組成一個和諧子序列,此時更新最大和諧子序列的長度 res,即更新為當前和諧子序列長度 val + cnt[key + 1] 的較大值。最后,返回最長的和諧子序列長度 res。通過這種方式,代碼實現了高效的查找和更新,從而得到數組中最長和諧子序列的長度。

4.題解代碼:

class Solution {
public:int findLHS(vector<int>& nums) {unordered_map<int, int>cnt;//創建哈希表cntint res = 0;//定義一個變量res,用于儲存最終的子序列長度for (int num : nums)//遍歷?nums?數組中的每一個元素?num,將其作為鍵{cnt[num]++;//增加?cnt[num]?的計數。即統計每個數字在?nums?中出現的頻率   }for (auto [key, val] : cnt)//遍歷 cnt 中的每一個鍵值對,key 記錄數組中的數字,val 是該數字出現的次數{if (cnt.count(key + 1))//判斷?cnt?中是否存在鍵為?key + 1?的項。如果存在,說明?key?和?key + 1?的數字可以組成一個和諧子序列,因為它們之間的差值正好是 1{res = max(res, val + cnt[key + 1]);//如果存在 key + 1 ,則更新res,確保它的值是最長和諧子序列的長度}}return res;//返回?res,即數組?nums?中最長和諧子序列的長度}
};

5.示例演算:

輸入:[1,3,2,2,5,2,3,7]

執行步驟cnt?內容當前?key檢查?key+1計算長度res?更新
初始化后{}---0
處理元素 `
1`{1:1}---0
處理元素 `
3`{1:1, 3:1}---0
處理元素 `
2`{1:1, 2:1, 3:1}---0
處理元素 `
2`{1:1, 2:2, 3:1}---0
處理元素 `
5`{1:1, 2:2, 3:1, 5:1}---0
處理元素 `
2`{1:1, 2:3, 3:1, 5:1}---0
處理元素 `
3`{1:1, 2:3, 3:2, 5:1}---0
處理元素 `
7`{1:1, 2:3, 3:2, 5:1, 7:1}---0
遍歷?key=1不變1存在 (key=2)1+3=44
遍歷?key=2不變2存在 (key=3)3+2=55
遍歷?key=3不變3不存在 (key=4)-5
遍歷?key=5不變5不存在 (key=6)-5
遍歷?key=7不變7不存在 (key=8)-5
最終結果5

6.復雜度計算:

時間復雜度:需要遍歷一次 nums 數組和哈希表中的每個元素,故時間復雜度為O(n)

空間復雜度:我們使用了一個哈希表來存儲數組中每個不同元素的頻次,最壞情況下哈希表的大小為n,故空間復雜度為O(n)

7.拓展:

雙指針解法:

通過兩個指針begin和end來找出數組中和諧序列的最大長度。

首先,數組排序,以便相同的元素聚集在一起。然后,初始化begin為0,res為0,表示和諧序列的最大長度。接下來,通過一個for循環遍歷數組,end指針從頭到尾逐一檢查每個元素。在每次循環中,begin指針會向右移動,直到滿足nums[end] - nums[begin] <= 1的條件,這樣保證了當前窗口內的最大值和最小值之差不超過1。若nums[end] - nums[begin] == 1,則計算當前窗口的長度end - begin + 1,并更新res為最大值。最終返回最大和諧序列的長度res。通過這種方式,代碼高效地查找和更新符合條件的最長和諧子序列的長度。

class Solution {
public:int findLHS(vector<int>& nums) {sort(nums.begin(), nums.end());  // 排序預處理,使相鄰元素更容易比較int begin = 0;  // 定義滑動窗口的左指針,初始化為數組的第一個元素int res = 0;    // 初始化最大和諧序列的長度為0for (int end = 0; end < nums.size(); end++) {  // 右指針從頭到尾遍歷整個數組// 當窗口中最大值與最小值的差大于1時,縮小窗口while (nums[end] - nums[begin] > 1) {begin++;  // 左指針右移,縮小窗口,直到滿足條件}// 如果當前窗口中的最大值與最小值的差正好為1,說明找到了一個和諧序列if (nums[end] - nums[begin] == 1) {res = max(res, end - begin + 1);  // 更新和諧序列的最大長度}}return res;  // 返回找到的最大和諧序列的長度}
};

雙指針解法的空間效率更高,而哈希表解法的時間效率更高。

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

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

相關文章

阿里云-云效自動部署spring boot項目

1.使用云效通過docker自動部署spring boot項目 1.1 spring boot項目配置 # 阿里云的jdk17鏡像 FROM registry.cn-zhangjiakou.aliyuncs.com/publicci/openjdk:17-jdk-alpineENV APP_HOME /home/admin/app/# 將target/arms-application.jar 復制到容器中 /home/admin/app/app.…

SQL篇 添加約束、刪除約束

SQL篇 添加約束、刪除約束 1、相關鏈接2、約束的增刪找查2.1 查看約束&#xff08;主鍵、外鍵、唯一性、檢查約束&#xff09;2.2 查看默認約束2.3 修改約束&#xff08;添加/編輯/修改&#xff09;2.3.1 添加主鍵約束2.3.2 添加外鍵約束2.3.3 添加唯一性約束2.3.4 添加檢查約束…

Python PyTorch 深度學習庫 包 timm

文章目錄 &#x1f4e6; 主要特點&#x1f680; 安裝方式&#x1f9ea; 使用示例示例1&#xff1a;加載一個預訓練模型進行圖像分類示例2&#xff1a;獲取模型結構信息 &#x1f310; 官方資源&#x1f50d; 常見用途? 優勢總結 Timm 是一個非常流行且功能強大的 Python 深度學…

tree 命令集成到 Git Bash:可視化目錄結構的指南

目錄 1. 下載與準備 tree 工具 ??2. 集成 tree 到 Git Bash 環境 ??3. tree 命令基礎用法詳解 ??4. 使用示例 在軟件開發和文件管理中&#xff0c;清晰的目錄結構可視化是提高效率的重要手段。tree命令作為 UNIX/Linux 系統的標準工具&#xff0c;能以樹形結構遞歸展…

如何搭建基于RK3588的邊緣服務器集群?支持12個RK3588云手機

以下是基于RK3588搭建邊緣服務器集群的完整實施方案&#xff0c;涵蓋硬件選型、集群架構、軟件部署及優化要點&#xff1a; &#x1f5a5;? ?一、硬件集群架構設計? ?節點基礎配置? ?核心單元?&#xff1a;單節點采用RK3588核心板&#xff08;4A762.4GHz 4A551.8GHz&am…

飛算 JavaAI:我的編程強力助推引擎

文章目錄 引言&#xff1a;當Java開發遇上AI助手初識飛算JavaAI&#xff1a;專為Java而生的智能伴侶安裝與配置&#xff1a;輕松上手的開始核心功能體驗&#xff1a;從需求到代碼的全流程革命1. 智能需求分析與拆解2. 智能接口設計3. 表結構智能生成4. 處理邏輯自動梳理5. 高質…

飛算JavaAI—AI編程助手 | 編程領域的‘高科技指南針’,精準導航開發!

目錄 一、引言 1.1 什么是飛算JavaAI&#xff1f; 1.2 告別"996的孤獨感"&#xff1a;AI成為你的編碼搭子 1.3 成就感加速器&#xff1a;從"能運行"到"優雅實現" 1.4 極簡下載體驗&#xff1a;3步開啟"開掛"模式 二、深入體驗飛…

NPM組件 betsson 等竊取主機敏感信息

【高危】NPM組件 betsson 等竊取主機敏感信息 漏洞描述 當用戶安裝受影響版本的 betsson 組件包時會竊取用戶的主機名、用戶名、工作目錄、IP地址等信息并發送到攻擊者可控的服務器地址。 MPS編號MPS-2nrw-lifd處置建議強烈建議修復發現時間2025-06-30投毒倉庫npm投毒類型主…

Apipost 與 Apifox:API 開發管理中的 AI 能力對比

在當今競爭激烈的 API 開發與測試領域&#xff0c;效率與質量是衡量工具優劣的關鍵指標。Apipost 憑借其強大的 AI 功能&#xff0c;為開發者和測試人員帶來了前所未有的便利&#xff0c;而 Apifox 作為該領域的重要參與者&#xff0c;二者在實際應用中究竟有何差異&#xff1f…

Electron 菜單欄深度定制指南:從基礎到高級實踐

在現代桌面應用開發中&#xff0c;菜單欄作為用戶界面的重要組成部分&#xff0c;不僅提供了應用功能的快速訪問途徑&#xff0c;還直接影響著用戶的操作體驗。Electron 作為跨平臺桌面應用開發框架&#xff0c;為開發者提供了強大而靈活的菜單系統定制能力。本文將全面介紹 El…

QML通過XMLHttpRequest實現HTTP通信

轉自個人博客 由于 QML 的 JavaScript 兼容性&#xff0c;我們可以直接使用 JavaScript 的 XMLHttpRequest 對象進行 HTTP 請求。QML 的 XMLHttpRequest 實現與標準瀏覽器的實現非常相似&#xff0c;但有一些限制和特殊行為需要注意。 而QML實現TCP等其他通信一般就需要借助Qt與…

Spring Boot 內置反向代理(Undertow Proxy)高可用配置

引言 在微服務架構中&#xff0c;反向代理是一個不可或缺的組件&#xff0c;它負責請求轉發、負載均衡、安全過濾等關鍵功能。 通常我們會選擇 Nginx、HAProxy 等專業反向代理組件&#xff0c;但在某些場景下&#xff0c;使用 Spring Boot 內置的反向代理功能可以簡化架構&am…

ClickHouse 部署

Docker 部署 1、拉取鏡像 docker pull clickhouse/clickhouse-server:latest單機版本部署 編寫docker-compose.yml version: 3services:clickhouse-server:image: clickhouse/clickhouse-server:22.12container_name: clickhouse-serverports:- "8123:8123"ulimit…

Fiddler中文版抓包工具如何幫助前端開發者高效調試

前端開發早已不再是“寫好頁面就完事”的工作。隨著業務復雜度提升&#xff0c;前端開發者需要直面接口聯調、性能優化、跨域排查、HTTPS調試等一系列和網絡請求緊密相關的任務。抓包工具成為這些環節中不可替代的得力助手&#xff0c;而 Fiddler抓包工具 因其全面的功能和靈活…

WTL 之trunk技術學習

相比于MFC的消息機制&#xff0c;WTL/ATL的實現更加優雅。后者將win32 API與面向對象技術完美地結合起來&#xff0c;去掉了龐雜的MFC依賴&#xff0c;生成的軟件體積更小&#xff0c;運行速度更快。在其中&#xff0c;如何將窗口函數轉變為對窗口對象成員函數的調用&#xff0…

Linux——11.軟件安裝與包管理

Linux 與 Windows 系統在軟件安裝方式上的差異 Linux: Linux 通過 包管理系統(如 Debian 的 apt、Red Hat 的 yum/dnf)將軟件打包為二進制安裝包(如 .deb、.rpm),每個包包含程序文件、依賴關系和元數據。包管理系統負責統一管理軟件的安裝、更新、卸載,并自動處理依賴關…

無人機用shell遠程登錄機載電腦,每次需要環境配置原因

原因&#xff1a; 終端分為“登錄 shell”和“非登錄 shell”&#xff1a; - 登錄 shell&#xff08;如開機登錄、遠程 SSH 連接&#xff09;會加載 .profile 或 .bash_profile 。 - 非登錄 shell&#xff08;如打開新終端窗口&#xff09;會加載 .bashrc 。 - 如果環境變量…

HarmonyOS5 折疊屏適配測試:驗證APP在展開/折疊狀態下的界面自適應,以及會出現的問題

以下是HarmonyOS5折疊屏應用在展開/折疊狀態下的UI自適應測試方案及技術實現要點&#xff1a; 一、核心測試維度 ?狀態連續性驗證? 頁面滾動位置保持&#xff08;需通過display.on(foldStatusChange)監聽狀態并保存/恢復滾動位置&#xff09;輸入內容保留&#xff08;使用…

Introduction to Software Engineering(TE)

Program Design Language 也稱為&#xff1a;偽代碼語言&#xff08;Pseudo-code Language&#xff09; PDL 的同類&#xff08;或相關替代&#xff09; 名稱簡介是否代碼結構化流程圖 (Flowchart)用圖形方式描述處理邏輯?偽代碼 (Pseudo-code)通用術語&#xff0c;PDL就是…

DM8數據庫入門到熟練

1、部署 1.1、下載 用戶在安裝 DM 數據庫之前需要檢查或修改操作系統的配置&#xff0c;以保證 DM 數據庫能夠正確安裝和運行。 操作系統CPU數據庫CentOS7x86_64dm8_20250506_x86_rh7_64.zip 1.2、新建 dmdba 用戶 安裝前必須創建 dmdba 用戶&#xff0c;禁止使用 root 用戶…