《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS)

《靈珠覺醒:從零到算法金仙的C++修煉》卷三·天劫試煉(32)萬劍歸宗破妖陣 - 最長遞增子序列(LIS)

哪吒在數據修仙界中繼續他的修煉之旅。這一次,他來到了一片神秘的萬劍谷,谷中有一座巨大的萬劍歸宗劍陣,劍陣閃爍著神秘的光芒。谷口有一塊巨大的石碑,上面刻著一行文字:“欲破此陣,需以萬劍歸宗之力,破妖陣,最長遞增子序列顯真身。”

哪吒定睛一看,石碑上還有一行小字:“數組[10, 9, 2, 5, 3, 7, 101, 18]的最長遞增子序列為[2, 5, 7, 101],長度為4。”哪吒心中一動,他知道這是一道關于尋找最長遞增子序列(LIS)的難題,需要通過動態規劃或二分優化的方法,找到數組中最長的遞增子序列。

暴力解法:萬劍歸宗的初次嘗試

哪吒心想:“要尋找最長遞增子序列,我可以逐個元素比較。”他催動萬劍歸宗之力,從數組的第一個元素開始,逐個元素比較,試圖找到最長的遞增子序列。

int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n, 1); // dp[i]表示以nums[i]結尾的最長遞增子序列的長度for (int i = 0; i < n; ++i) {for (int j = 0; j < i; ++j) {if (nums[i] > nums[j]) {dp[i] = max(dp[i], dp[j] + 1);}}}return *max_element(dp.begin(), dp.end());
}

哪吒成功地找到了最長遞增子序列,但萬劍歸宗的光芒卻黯淡了下來。他意識到,這種方法雖然可行,但效率低下,尤其是當數組很大時,靈力消耗巨大。

C++語法點

在C++中,動態規劃是解決最長遞增子序列問題的常用方法。以下是一些重要特性:

  • 動態規劃

    • 動態規劃通過將問題分解為子問題,并存儲子問題的解來避免重復計算。
    • 常用操作:
      • 使用vector動態數組存儲子問題的解。
      • 通過狀態轉移方程計算當前問題的解。
  • 數組操作

    • 使用vector<int>表示動態數組。
    • 常用方法:
      • vector<int> dp(n, 1):創建一個大小為n的動態數組,并初始化所有元素為1。
      • max_element(dp.begin(), dp.end()):找到數組中的最大值。

高階優化:二分優化的智慧

哪吒元神中突然浮現金色銘文——「萬劍歸宗,二分優化顯真身」。他意識到,可以通過二分優化的方法,將時間復雜度降低到O(n log n)。

哪吒決定使用二分優化,維護一個數組tails,其中tails[i]表示長度為i+1的遞增子序列的最小末尾元素。通過這種方式,他成功地找到了最長遞增子序列,而且靈力消耗大幅減少。

int lengthOfLIS(vector<int>& nums) {vector<int> tails;for (int num : nums) 

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

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

相關文章

【redis】使用redis作為緩存時所注意事項

緩存更新策略 在 Redis 緩存中&#xff0c;緩存的更新策略主要有**定期生成&#xff08;定時更新&#xff09;和實時生成&#xff08;即時更新&#xff09;**兩種方式。不同的策略適用于不同的業務場景&#xff0c;涉及性能、數據一致性和系統負載等方面的權衡。 1. 定期生成&…

計算機網絡:計算機網絡的分類

按分布范圍分類&#xff1a;廣域網&#xff0c;城域網&#xff0c;局域網&#xff0c;個域網 按傳輸技術分類&#xff1a;廣播式網絡&#xff0c;點對點網絡 按拓撲結構分類&#xff1a;總線型&#xff0c;環形&#xff0c;星形&#xff0c;網狀 按傳輸介質分類&#xff1a;…

解決pip安裝uv時下載速度慢

驗證優化效果 方案 1&#xff1a;臨時使用國內鏡像源&#xff08;推薦&#xff09; pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple 速度提升&#xff1a;鏡像源服務器位于國內&#xff0c;帶寬充足&#xff0c;通常可達 1-10MB/s 支持源列表&#xff1a; # 清…

SpringCloud Alibaba——入門簡介

一、是什么 &#xff08;1&#xff09;誕生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入駐了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央庫發布了第一個版本 &#xff08;2&#xff09;介紹 &#xff08;3&#xff09;&#xff1f;何為必須組件 二、能干嘛…

Python完全指南:從基礎到實踐的編程藝術

引言&#xff1a;數字時代的瑞士軍刀 在人工智能與大數據浪潮中&#xff0c;Python如同編程世界的"瑞士軍刀"&#xff0c;以其優雅的語法和強大的生態征服全球開發者。本文將從語言哲學到實戰應用&#xff0c;為您展開Python編程的全景畫卷&#xff0c;揭示這門語言…

Docker 運行 GPUStack 的詳細教程

GPUStack GPUStack 是一個用于運行 AI 模型的開源 GPU 集群管理器。它具有廣泛的硬件兼容性&#xff0c;支持多種品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服務器上運行。GPUStack 支持各種 AI 模型&#xff0c;包括大型語言模型&#xff08;LLMs&am…

完整例子和調用關系qt OpenGL

項目結構 首先&#xff0c;你需要在 Qt 項目中創建一個類&#xff0c;繼承自 QOpenGLWidget 來進行 OpenGL 渲染。文件結構如下&#xff1a; - main.cpp - MyOpenGLWidget.h - MyOpenGLWidget.cpp - vertex_shader.glsl - fragment_shader.glsl 1. main.cpp 這是 Qt 項目的入口…

VSCode 配置優化指南:打造極致高效的前端開發環境

VSCode 配置優化指南&#xff1a;打造極致高效的前端開發環境 一、基礎環境配置&#xff1a;讓開發更流暢 1. 性能優化設置 // settings.json {"files.autoSave": "afterDelay", // 自動保存&#xff08;延遲1秒&#xff09;"files.exclud…

源IP泄露后如何涅槃重生?高可用架構與自動化防御體系設計

一、架構層解決方案 1. 高防代理架構設計 推薦架構&#xff1a; 用戶 → CDN&#xff08;緩存靜態資源&#xff09; → 高防IP&#xff08;流量清洗&#xff09; → 源站集群&#xff08;真實IP隱藏&#xff09; ↑ Web應用防火墻&#xff08;WAF&#xff09; 實施要點&a…

【英偉達AI論文】多模態大型語言模型的高效長視頻理解

摘要&#xff1a;近年來&#xff0c;基于視頻的多模態大型語言模型&#xff08;Video-LLMs&#xff09;通過將視頻處理為圖像幀序列&#xff0c;顯著提升了視頻理解能力。然而&#xff0c;許多現有方法在視覺主干網絡中獨立處理各幀&#xff0c;缺乏顯式的時序建模&#xff0c;…

無障礙閱讀(Web Accessibility)NVDA打開朗讀查看器后,enter鍵不生效的原因

用NVDA測試Web Accessibility時&#xff0c;打開朗讀查看器&#xff0c;enter鍵會無效&#xff0c;而不打開測試器&#xff0c;就沒有問題&#xff0c;很大原因是被應用的元素不是可聚焦的&#xff0c;解決方法嘗試&#xff1a; 將標簽改為可聚焦的語義化標簽&#xff0c;如 b…

2Android中的AIDL是什么以及如何使用它

一、Android中的AIDL概述 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android系統中用于定義和實現跨進程通信&#xff08;IPC&#xff09;接口的語言。它允許一個進程向另一個進程發送請求并獲取響應&#xff0c;是Android中實現進程間通信的一種重…

Python繪制數據分析中經典的圖形--列線圖

Python繪制數據分析中經典的圖形–列線圖 列線圖是數據分析中的經典圖形&#xff0c;通過背后精妙的算法設計&#xff0c;展示線性模型&#xff08;logistic regression 和Cox&#xff09;中各個變量對于預測結果的總體貢獻&#xff08;線段長短&#xff09;&#xff0c;另外&…

leetcode【面試經典150系列】(一)

目錄 121.買賣股票最佳時機 題目描述 示例 算法分析 代碼(python3) 122.買賣股票最佳時機II 題目描述 示例 算法分析 代碼&#xff08;python3&#xff09; 55.跳躍游戲 題目描述 示例 算法分析 代碼 45.跳躍游戲II 題目描述 示例 算法分析 代碼 121.買賣股票…

為什么會出現redis數據庫?redis是什么?

什么是 Redis? 為什么要用 Redis? 下面我將從 Redis 出現的背景、Redis 的解決方案個來回答。 1、Redis 出現的背景 互聯網的應用越來越多&#xff0c;例如社交網絡、電商、實時服務發展的十分迅速&#xff0c;這就導致了傳統技術棧&#xff08;如關系型數據庫&#xff09;…

Windows 11下Git Bash執行cURL腳本400問題、CMD/PowerShell不能執行多行文本等問題記錄及解決方案

問題 在Postman里可成功執行的POST請求&#xff1a; 找到Postman的Code 因為cURL基本上算是行業標準&#xff0c;所以Postman默認選中cURL&#xff0c;支持切換不同的開發語言&#xff1a; 點擊上圖右上角的復制按鈕&#xff0c;得到cURL腳本。 Windows 11家庭版&#xff…

Docker基礎入門(一)

初識Docker 什么是Docker Docker是一個快速交付應用、運行應用的技術&#xff1a; 可以將程序及其依賴、運行環境一起打包為一個鏡像&#xff0c;可以遷移到任意Linux操作系統運行時利用沙箱機制形成隔離容器&#xff0c;各個應用互不干擾啟動、移除都可以通過一行命令完成&…

容器編排革命:從 Docker Run 到 Docker Compose 的進化之路20250309

容器編排革命&#xff1a;從 Docker Run 到 Docker Compose 的進化之路 一、容器化部署的范式轉變 在 Docker 生態系統的演進中&#xff0c;容器編排正從“手動操作”走向“自動化管理”。根據 Docker 官方 2023 年開發者調查報告&#xff0c;78% 的開發者已采用 Docker Compo…

c++ 嵌入匯編的方式實現int型自增

x86/x86_64 實現 x86 平臺上&#xff0c;使用 LOCK XADD 指令來實現原子自增&#xff1a; #include <iostream>inline int atomic_increment_x86(int* value) {int result;__asm__ __volatile__("lock xaddl %1, %0": "m"(*value), "r"(…

區塊鏈與去中心化技術

區塊鏈與去中心化技術 核心進展 區塊鏈從加密貨幣&#xff08;如比特幣&#xff09;擴展至智能合約和供應鏈管理。以太坊2.0引入分片技術提升交易吞吐量&#xff0c;而零知識證明&#xff08;ZKP&#xff09;增強了隱私保護15。企業級應用如IBM的Food Trust平臺通過區塊鏈追蹤…