算法思維進階 力扣 300.最長遞增子序列 暴力搜索 記憶化搜索 DFS 動態規劃 C++詳細算法解析 每日一題

目錄

  • 零、題目描述
  • 一、為什么這道題值得你深入理解?
  • 二、題目拆解:提取核心關鍵點
  • 三、明確思路:從暴力到優化的完整進化
    • 3. 進一步優化:動態規劃(自底向上遞推)
    • 4. 終極優化:貪心 + 二分查找(O(n log n))
  • 四、算法實現:從暴力到優化的完整代碼
    • 1. 暴力遞歸(超時,僅作思路展示)
    • 2. 記憶化搜索(用戶提供的代碼詳解)
    • 3. 動態規劃(自底向上遞推)
    • 4. 貪心 + 二分查找(O(n log n)優化)
  • 五、記憶化搜索與動態規劃的對比
  • 六、實現過程中的坑點總結
  • 七、舉一反三
  • 八、總結

零、題目描述

題目鏈接:力扣 300.最長遞增子序列

在這里插入圖片描述

示例 1:
輸入:nums = [10,9,2,5,3,7,101,18]
輸出:4
解釋:最長遞增子序列是 [2,3,7,101],長度為 4。

示例 2:
輸入:nums = [0,1,0,3,2,3]
輸出:4
解釋:最長遞增子序列是 [0,1,3,3][0,1,2,3],長度為 4。

示例 3:
輸入:nums = [7,7,7,7,7,7,7]
輸出:1
解釋:所有元素相同,最長遞增子序列長度為 1(子序列需嚴格遞增)。

提示:1 <= nums.length <= 2500-10^4 <= nums[i] <= 10^4

代碼框架:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {}
};

一、為什么這道題值得你深入理解?

“最長遞增子序列(LIS)”是動態規劃領域的“序列類問題標桿”,其重要性遠超一道普通算法題。如果說“不同路徑”展現了網格類DP的邏輯,那么LIS則揭示了序列類子問題的核心拆解思路——它是理解“子序列依賴關系”“狀態定義與轉移”的絕佳載體。

對于初學者而言,這道題的價值體現在三個關鍵維度:

  • 完整的優化鏈條:從指數級復雜度的暴力遞歸,到O(n2)的記憶化搜索/動態規劃,再到O(n log n)的貪心+二分優化,每一步優化都伴隨著對問題本質的更深理解,讓你清晰看到“算法效率提升”的底層邏輯;
  • 子序列問題的通用思維:子序列(不要求連續)與子數組(要求連續)的核心區別,以及如何通過“狀態定義”規避子序列的“不連續性”帶來的復雜度——這種思維可直接遷移到最長公共子序列、編輯距離等經典問題;
  • 貪心與二分的巧妙結合:當動態規劃達到瓶頸時,如何通過“貪心選擇”重構問題,再結合二分查找實現效率飛躍,這是算法設計中“跨領域融合”的典型案例,能幫你打破“動態規劃只能用遞推”的思維定式。

哪怕你已經知道解法,重新梳理這道題的思路仍能收獲新認知——因為LIS的每種解法都對應著一種算法設計范式,理解它們的關聯與差異,能幫你建立更系統的解題思維。

二、題目拆解:提取核心關鍵點

“最長遞增子序列”的核心是序列類動態規劃,需拆解出三個關鍵要素:

  1. 問題本質:在無序整數數組中,找到一個嚴格遞增的子序列(元素順序與原數組一致,不要求連續),使其長度最長。

    • 例如 [10,9,2,5,3,7] 中,[2,3,7] 是遞增子序列,長度為3;[2,5,7] 是更長的,長度為3(實際最長為3?不,這里正確最長是3嗎?不,正確是 [2,5,7] 長度3,或 [2,3,7] 也是3,其實示例1中是4,這里只是舉例)。
  2. 遞推關系:對于位置 i 的元素,其最長遞增子序列長度 = 1 + 所有位置 j > inums[j] > nums[i] 的元素的最長遞增子序列長度的最大值(1表示僅包含自身的子序列)。

  3. 邊界條件:每個元素自身可構成長度為1的子序列(當沒有比它大的后續元素時)。

核心矛盾:子序列的“不連續性”導致暴力枚舉所有可能子序列的復雜度為O(2?),必須通過“狀態壓縮”和“子問題存儲”優化——而如何定義“子問題”是破局的關鍵。

三、明確思路:從暴力到優化的完整進化

1. 最直觀的想法:暴力遞歸
暴力遞歸的核心是“枚舉所有可能的遞增子序列”,通過遞歸計算每個位置開始的最長遞增子序列長度。

思路拆解

  • 定義 dfs(i) 表示“從索引 i 開始的最長遞增子序列長度”;
  • 對于 i,需要遍歷所有 j > inums[j] > nums[i] 的位置,dfs(i) 即為這些 dfs(j) + 1 中的最大值(若沒有符合條件的 j,則 dfs(i) = 1);
  • 最終結果為所有 dfs(i)i 從0到n-1)的最大值。

示例推演(以 nums = [2,5,3,7] 為例):

  • dfs(3)(元素7):后面無元素,返回1;
  • dfs(2)(元素3):后面只有7 > 3,dfs(2) = dfs(3) + 1 = 2
  • dfs(1)(元素5):后面7 > 5,dfs(1) = dfs(3) + 1 = 2
  • dfs(0)(元素2):后面5、3、7均大于2,dfs(0) = max(dfs(1)+1, dfs(2)+1, dfs(3)+1) = max(3, 3, 2) = 3
  • 最終結果為 max(3,2,2,1) = 3(實際最長子序列為 [2,5,7][2,3,7],長度3)。

暴力遞歸的問題:大量重復計算。例如 dfs(3) 在計算 dfs(2)dfs(1)dfs(0) 時被多次調用,當 n 增大(如 n=20),時間復雜度會達到O(2?),必然超時。

在這里插入圖片描述

  1. 優化思路:記憶化搜索(帶備忘錄的遞歸)
    暴力遞歸的核心問題是“重復計算相同子問題”,因此引入“備忘錄”存儲已計算的 dfs(i) 結果,避免重復遞歸。

思路升級

  • 用數組 memo 記錄 dfs(i) 的結果,memo[i] = 0 表示未計算,非0表示已計算的結果;
  • 計算 dfs(i) 前先檢查 memo[i],若已計算則直接返回,否則計算后存入 memo[i]

示例優化效果(仍以 nums = [2,5,3,7] 為例):

  • 計算 dfs(3) 后,memo[3] = 1,后續再用到時直接返回;
  • 計算 dfs(2) 時,調用 dfs(3) 直接取 memo[3],得到 memo[2] = 2
  • 計算 dfs(1) 時,調用 dfs(3) 直接取 memo[3],得到 memo[1] = 2
  • 計算 dfs(0) 時,調用 dfs(1)dfs(2)dfs(3) 均直接取備忘錄,得到 memo[0] = 3
  • 所有子問題僅計算一次,時間復雜度降至O(n2)。

3. 進一步優化:動態規劃(自底向上遞推)

記憶化搜索是“自頂向下”(從每個位置遞歸到末尾),而動態規劃可“自底向上”(從末尾遞推到開頭),用數組 dp 系統存儲子問題結果,消除遞歸棧開銷。

狀態定義的智慧
定義 dp[i] 表示“以索引 i 為結尾的最長遞增子序列長度”(與記憶化搜索的 dfs(i) 定義方向相反,但本質等價)。

狀態轉移的邏輯

  • 對于 i(從0到n-1),初始化 dp[i] = 1(自身構成子序列);
  • 遍歷所有 j < inums[j] < nums[i] 的位置,dp[i] = max(dp[i], dp[j] + 1)(即“以 j 結尾的最長子序列 + 當前元素 i”);
  • 最終結果為 dp 數組中的最大值。

與記憶化搜索的對偶性
記憶化搜索的 dfs(i) 是“從 i 開始往后找”,動態規劃的 dp[i] 是“從 i 往前找”,兩者都是通過子問題的解推導當前問題,只是遍歷方向相反。

4. 終極優化:貪心 + 二分查找(O(n log n))

n 達到10?時,O(n2)的動態規劃會超時,此時需要更高效的方法。核心思路是通過“貪心選擇”維護一個“可能的最長遞增子序列的最小尾部”,再用二分查找優化更新過程。

貪心思想
對于長度為 k 的遞增子序列,其尾部元素越小,后續能接的元素就越多(更容易找到比它大的元素)。因此,我們可以維護一個數組 tails,其中 tails[k] 表示“長度為 k+1 的遞增子序列的最小尾部元素”。

二分查找的作用

  • 遍歷數組時,對于當前元素 x
    • x 大于 tails 的最后一個元素,直接加入 tails(最長子序列長度+1);
    • 否則,在 tails 中找到第一個大于等于 x 的位置 pos,將 tails[pos] 替換為 x(用更小的尾部元素更新同長度的子序列);
  • 最終 tails 的長度即為最長遞增子序列的長度。

示例理解
對于 nums = [3, 1, 2, 4, 3]

  • tails 初始為空;
  • 3:tails 為空,加入 → [3]
  • 1:1 < 3,找 tails 中第一個 ≥1 的位置(0),替換 → [1]
  • 2:2 > 1,加入 → [1,2]
  • 4:4 > 2,加入 → [1,2,4]
  • 3:3 < 4,找第一個 ≥3 的位置(2),替換 → [1,2,3]
  • 最終 tails 長度為3,即最長遞增子序列長度為3(如 [1,2,4][1,2,3])。

四、算法實現:從暴力到優化的完整代碼

1. 暴力遞歸(超時,僅作思路展示)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();int maxLen = 0;for (int i = 0; i < n; i++) {maxLen = max(maxLen, dfs(i, nums));}return maxLen;}// 從索引i開始的最長遞增子序列長度int dfs(int i, vector<int>& nums) {int n = nums.size();int len = 1;  // 至少包含自身for (int j = i + 1; j < n; j++) {if (nums[j] > nums[i]) {len = max(len, dfs(j, nums) + 1);}}return len;}
};

時間復雜度:O(2?)(每個元素有選或不選兩種可能,實際略低但仍為指數級)。
空間復雜度:O(n)(遞歸棧深度)。

2. 記憶化搜索(用戶提供的代碼詳解)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> memo(n);  // 備忘錄:memo[i]表示從i開始的最長遞增子序列長度(初始為0,未計算)int ret = 0;// 遍歷每個起點,取最大值for(int i = 0; i < nums.size(); i++)ret = max(ret, dfs(i, nums, memo));return ret;}int dfs(int pos, vector<int>& nums, vector<int>& memo) {// 若已計算,直接返回備忘錄中的結果(剪枝)if (memo[pos] != 0)return memo[pos];int ret = 1;  // 至少包含自身,長度為1// 遍歷pos之后的所有元素for (int i = pos + 1; i < nums.size(); i++) {// 若后續元素大于當前元素,可構成更長的子序列if (nums[i] > nums[pos]) {ret = max(ret, dfs(i, nums, memo) + 1);  // 遞歸計算i的結果,加1(當前元素)}}// 將結果存入備忘錄memo[pos] = ret;return ret;}
};

代碼詳解

  • 備忘錄設計memo[pos] 存儲“從 pos 開始的最長遞增子序列長度”,初始為0表示“未計算”,計算后更新為具體值,避免重復遞歸;
  • 遞歸邏輯:對于 pos,通過遍歷后續元素 i,找到所有比 nums[pos] 大的元素,遞歸計算 i 的最長子序列長度,加1后取最大值(即“pos + 以 i 開始的子序列”);
  • 結果匯總:由于最長子序列可能從任意位置開始,因此需要遍歷所有起點 i,取 dfs(i) 的最大值。

時間復雜度:O(n2)(每個位置被計算一次,每次計算遍歷后續元素,共n + (n-1) + … + 1 = O(n2))。
空間復雜度:O(n)(備忘錄數組 + 遞歸棧深度,均為O(n))。

3. 動態規劃(自底向上遞推)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();if (n == 0) return 0;vector<int> dp(n, 1);  // dp[i]:以i為結尾的最長遞增子序列長度int maxLen = 1;for (int i = 0; i < n; i++) {// 遍歷i之前的所有元素jfor (int j = 0; j < i; j++) {// 若j的元素小于i的元素,可構成更長的子序列if (nums[j] < nums[i]) {dp[i] = max(dp[i], dp[j] + 1);}}maxLen = max(maxLen, dp[i]);  // 更新全局最大值}return maxLen;}
};

與記憶化搜索的對比

  • 動態規劃的 dp[i] 是“以 i 結尾”,記憶化搜索的 dfs(i) 是“以 i 開始”,兩者通過“反向遍歷”實現等價的子問題求解;
  • 動態規劃通過迭代避免遞歸棧開銷,更適合 n 較大的場景(但時間復雜度相同)。

4. 貪心 + 二分查找(O(n log n)優化)

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> tails;  // tails[k]:長度為k+1的遞增子序列的最小尾部元素for (int x : nums) {// 二分查找tails中第一個 >= x的位置auto it = lower_bound(tails.begin(), tails.end(), x);if (it == tails.end()) {// x比所有尾部元素大,加入tails(最長長度+1)tails.push_back(x);} else {// 用x替換該位置的元素(更新同長度子序列的最小尾部)*it = x;}}return tails.size();  // tails的長度即為最長遞增子序列的長度}
};

核心原理

  • tails 數組始終保持遞增(因為 tails[k] 是長度 k+1 的最小尾部,必然小于 tails[k+1]);
  • 對于 x,若能接在 tails 末尾,說明可形成更長的子序列;否則,替換 tails 中第一個大于等于 x 的元素,目的是“用更小的尾部元素給后續元素留出更多可能性”;
  • 最終 tails 的長度就是最長遞增子序列的長度(但 tails 本身不一定是實際的子序列,只是長度正確)。

時間復雜度:O(n log n)(遍歷數組O(n),每次二分查找O(log k),k 最大為n,因此總復雜度O(n log n))。
空間復雜度:O(n)(tails 數組的最大長度為n)。

五、記憶化搜索與動態規劃的對比

維度記憶化搜索(遞歸)動態規劃(遞推)
核心思路自頂向下:從每個位置 i 向后遞歸,計算“從 i 開始的最長子序列”自底向上:從每個位置 i 向前遍歷,計算“以 i 結尾的最長子序列”
狀態表示dfs(i):從 i 開始的最長遞增子序列長度dp[i]:以 i 結尾的最長遞增子序列長度
狀態轉移dfs(i) = max(dfs(j) + 1)j > inums[j] > nums[i]dp[i] = max(dp[j] + 1)j < inums[j] < nums[i]
計算順序遞歸調用,按需計算(需要哪個 i 才計算)按索引順序計算,從0到n-1依次填充 dp 數組
空間開銷遞歸棧(O(n)) + 備忘錄(O(n))dp 數組(O(n))
適用場景子問題依賴后續元素(如從當前位置向后找)子問題依賴前置元素(如從當前位置向前找)

本質聯系:兩種方法都通過“存儲子問題結果”避免重復計算,時間復雜度相同(O(n2)),只是遍歷子問題的方向不同。記憶化搜索更直觀(符合遞歸思維),動態規劃更高效(無遞歸棧開銷)。

六、實現過程中的坑點總結

  1. 子序列與子數組的混淆
    容易錯誤地認為“子序列必須連續”,導致在遍歷子問題時限制了 j 的范圍(如只看相鄰元素)。
    解決:明確子序列的定義(元素順序不變但可不連續),遍歷所有符合條件的前置/后置元素。

  2. 備忘錄初始化錯誤
    若將備忘錄初始化為0,但實際子序列長度可能為1(如單個元素),可能導致邏輯錯誤(如誤認為“未計算”)。
    解決:確保初始化值與“有效結果”不沖突(如用-1表示未計算,避免與1混淆)。

  3. 動態規劃的邊界處理
    忘記初始化 dp[i] = 1,直接進入循環計算,導致當沒有符合條件的 j 時,dp[i] 保持0,結果錯誤。
    解決:必須先初始化 dp[i] = 1(自身構成子序列),再進行后續更新。

  4. 貪心+二分的理解偏差
    誤認為 tails 數組是“實際的最長遞增子序列”,導致對替換邏輯的困惑(如為什么可以替換中間元素)。
    解決:明確 tails 的作用是“維護最小尾部以最大化后續可能性”,其值本身不代表最終子序列,僅長度有效。

七、舉一反三

掌握LIS的核心思路后,可解決以下變種問題:

  1. LeetCode 354. 俄羅斯套娃信封問題
    問題:信封有寬和高,只有寬和高都大于另一個信封時才能嵌套,求最大嵌套層數。
    思路:將信封按寬排序(寬相等時高降序),轉化為“高的最長遞增子序列”問題(避免寬相等時嵌套)。

  2. LeetCode 673. 最長遞增子序列的個數
    問題:求最長遞增子序列的數量。
    思路:在動態規劃中增加一個 count 數組,count[i] 記錄以 i 結尾的最長子序列的個數,根據 dp 數組的更新同步更新 count

  3. 最長遞增子序列的具體方案
    問題:不僅求長度,還要輸出一個最長遞增子序列。
    思路:在貪心+二分的基礎上,通過記錄每個元素的前驅索引,回溯構建具體子序列。

八、總結

“最長遞增子序列”是一道貫穿“暴力遞歸→記憶化搜索→動態規劃→貪心+二分”的經典題,每種解法都對應著不同的算法設計思路:

  • 記憶化搜索展現了“自頂向下”的遞歸優化思想,通過備忘錄消除重復計算;
  • 動態規劃體現了“自底向上”的遞推邏輯,用迭代方式系統解決子問題;
  • 貪心+二分則突破了動態規劃的思維定式,通過重構問題實現效率飛躍。

理解這道題的關鍵不僅在于記住解法,更在于掌握“狀態定義的藝術”——如何將復雜的序列問題拆解為可復用的子問題,以及在不同場景下選擇最優的解法(如小規模用DP,大規模用貪心+二分)。

下一篇,我們將講解力扣 375.猜數字大小 二,一起深入理解記憶化搜素。感興趣的朋友可以提前關注,讓我們一起在算法的世界里進階~

最后,歡迎在評論區分享你的解題思路或優化技巧,無論是對代碼的改進還是對思路的補充,都能幫助更多人理解這道題的本質~ 🌟

在這里插入圖片描述

如果覺得這篇講解對你有幫助,別忘了點贊+關注哦~ 后續會持續更新更多經典算法題的深度解析,帶你從“會做”到“看透本質”! 😉
在這里插入圖片描述

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

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

相關文章

圖解網絡-小林coding筆記(持續更新)

大綱 #mermaid-svg-trl6Q4B1uDO1z05w {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-trl6Q4B1uDO1z05w .error-icon{fill:#552222;}#mermaid-svg-trl6Q4B1uDO1z05w .error-text{fill:#552222;stroke:#552222;}#merm…

安寶特案例丨AR+AI+SOP?3大技術融合革新軍工航天領域

軍工、航空、航天領域存在 “小批量、多品種、依賴人工經驗裝配”的特性&#xff0c;這長期制約著生產效率與產品質量的提升。 技術融合應用案例 1 Arbigtec 裝配效率提升類&#xff1a; 某型導彈制導系統裝配&#xff1a;采用 AR 眼鏡與 AI 視覺引導系統&#xff0c;200 精…

ip link show 查看/配置網絡接口

ip link show&#xff08;或簡寫為 ip link&#xff09;是 Linux 系統中用于查看和配置網絡接口&#xff08;網卡、虛擬接口等&#xff09;的命令&#xff0c;屬于 iproute2 工具集的一部分。它是現代 Linux 系統中替代傳統 ifconfig 命令的更強大工具。命令詳解 基本語法 ip l…

電科金倉新一代數據庫一體機:以 “云數據庫 - AI 版” 引領 AI 時代數據庫變革

前言 AI時代的數據庫一體機市場&#xff0c;只能用兩個詞來形容&#xff1a;高手云集&#xff0c;戰況激烈&#xff01; 國際巨頭仍在高端市場占據主導地位&#xff0c;但在國產替代的沖擊下&#xff0c;也開始另尋突破口&#xff1b;國內科技大廠攻勢迅猛&#xff0c;通過開源…

IT運維的365天--033 跨交換機部署沒有單獨供電口的愛快AP到另一個地方去

前情提要&#xff1a;由于工作需要&#xff0c;領導要求在車間也添加一個無線網絡供員工和設備使用&#xff0c;之前公司已經有一個愛快網絡供員工使用&#xff0c;且物理隔絕部署在集團辦公樓這邊了。我一向是不喜歡碰到一個小事就拉一條網線&#xff0c;那樣不得搞的跟蜘蛛網…

Flutter開發實戰之路由與導航

第5章:路由與導航 在移動應用開發中,頁面間的跳轉是最基本也是最重要的功能之一。就像我們在現實生活中需要從一個房間走到另一個房間一樣,在App中,用戶需要在不同的界面間自由切換。Flutter提供了強大而靈活的路由系統來管理這些頁面跳轉,本章將深入探討Flutter的路由與…

Android 圖像編輯實戰指南:從基礎操作到進階效果

在移動應用中&#xff0c;圖像編輯功能已成為標配 —— 社交 APP 需要裁剪頭像&#xff0c;電商 APP 需要給商品圖加水印&#xff0c;工具 APP 需要提供濾鏡效果。看似簡單的 “裁剪”“縮放” 背后&#xff0c;實則涉及 Bitmap 像素操作、內存管理、性能優化等核心技術。很多開…

Java從入門到精通!第十八天(JDK17安裝以及網絡編程) 完結篇!!!

三、網絡編程1&#xff0e;網絡編程概述Java 是 Internet 上的語言&#xff0c;它從語言級上提供了對網絡應用程序的支持&#xff0c;程序員能夠很容易開發常見的網絡應用程序。2&#xff0e;網絡的基礎&#xff08;1&#xff09;計算機網絡把分布在不同地理區域的計算機與專門…

C++ STL常用容器總結(vector, deque, list, map, set)

C STL常用容器總結&#xff08;vector, deque, list, map, set&#xff09;1. vector&#xff08;動態數組&#xff09;特點定義和初始化常用操作遍歷方法2. deque&#xff08;雙端隊列&#xff09;特點定義和初始化常用操作3. list&#xff08;雙向鏈表&#xff09;特點定義和…

智能小車(F103C8T6)RT-THREAD版

前言 前面幾章學會了PWM,超聲波等&#xff0c;現在剛好結合起來控制智能小車 1&#xff1a;環境 KEIL5.38 RT-THREAD 3.1.3 STM32F103C8T6 2&#xff1a;硬件配件&#xff08;原來網上買的一套&#xff09; STM32F103C8T6 一個 MCU底板 一個 SG90 舵機 一個 紅外避障 2個 hc-…

Linux 遠程連接與文件傳輸:從基礎到高級配置

Linux 遠程連接與文件傳輸&#xff1a;從基礎到高級配置 在 Linux 系統管理中&#xff0c;遠程連接和文件傳輸是核心技能。SSH 協議提供了安全的遠程訪問方式&#xff0c;而基于 SSH 的 SFTP 和 SCP 則解決了跨服務器文件傳輸的需求。下面將詳細解析 SSH 服務配置、三種遠程操作…

17. 如何修改 flex 主軸方向

總結 flex-direction: row | row-reverse | column | column-reverse;一、作用說明 在 Flex 布局中&#xff0c;默認的主軸&#xff08;main axis&#xff09;方向是 水平向右&#xff08;即 row&#xff09;。 通過設置 flex-direction 屬性&#xff0c;可以靈活改變主軸的方向…

【Linux】重生之從零開始學習運維之mysql用戶管理

mariadb用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% to test310.0.0.%;用戶刪除 drop user test310.0.0.%;mysql用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% …

matlab小計

3.變量命名_嗶哩嗶哩_bilibili clc 清空頁面 文件名&#xff1a;字母開頭 clc:清除命令行窗口 clear all&#xff1a;清除工作區變量 編譯器里面 %%注釋 24 2-4 2*4 4/2 cumsum累計和 312 6123 movsum:滑窗計算數值 eg步長是3 1236 2349 6 9 ... 按列求最大值 先列…

getdents64系統調用及示例

getdents64 函數詳解 1. 函數介紹 getdents64 是 Linux 系統中用于讀取目錄內容的底層系統調用。可以把這個函數想象成一個"目錄內容掃描儀"——它能夠高效地掃描目錄中的所有文件和子目錄,就像超市的掃描槍快速讀取商品條碼一樣。 與高級的目錄操作函數(如 rea…

HBuilder X打包發布微信小程序

一、獲取AppId 二、獲取微信小程序AppId 三、發行->微信小程序&#xff0c;調起微信開發者工具 四、點擊上傳,上傳至微信公眾平臺 五、微信公眾平臺查看版本管理 完結&#xff01;&#xff01;&#xff01;

docker排查OOM

思路&#xff1a; 1.先從代碼程序上排查&#xff0c;線程池創建是否使用ThreadPoolExecutor&#xff0c;線程池各項設置是否合理。 任務對象是否釋放&#xff0c;網關是否需要限流。 2.服務器內存大小&#xff0c;cpu使用率&#xff0c;存儲空間大小&#xff0c;java程序啟動…

Web后端進階:springboot原理(面試多問)

1.配置優先級 3種配置文件: application.properties server.port8081application.yml server:port: 8082application.yaml server:port: 80822種外部屬性的配置(Java系統屬性、命令行參數): Java系統屬性配置 &#xff08;格式&#xff1a; -Dkeyvalue&#xff09; -Dserver.po…

第十天:字符菱形

每日一道C題&#xff1a;字符菱形 問題&#xff1a;給定一個字符&#xff0c;用它構造一個對角線長5個字符&#xff0c;傾斜放置的菱形。 要求&#xff1a;輸入只有一行&#xff0c; 包含一個字符&#xff1b;輸出該字符構成的菱形。 最基礎的做法&#xff1a; #include <io…

Qt 多線程編程最佳實踐

在現代軟件開發中&#xff0c;多線程編程是提升應用性能和響應性的關鍵技術。Qt 作為一個強大的跨平臺框架&#xff0c;提供了豐富的多線程支持&#xff0c;包括 QThread、QtConcurrent、信號槽機制等。本文將深入探討 Qt 多線程編程的最佳實踐&#xff0c;幫助開發者避免常見陷…