數據結構 順序表(3)---順序表的應用

在之間的兩篇文章中,我們著重講了順序表及順序表的實現。今天這篇文章我們將簡單講解關于順

序表的三個算法題。這三個題也都屬于力扣上的經典例題。

1.例題1:移除元素

?例題來源(力扣) : https://leetcode.cn/problems/remove-element/description/
這是一道數組操作算法題,核心任務是:

可以簡單理解為 : 給你一個裝著數字的“盒子”(數組 ?nums?)和一個特定數字(?val?),要你在這
個“盒子”里直接把所有等于?val?的數字去掉,并且把剩下的數字往前排,最后告訴別人剩下多少個

不等于 val?的數字(返回 ?k?)。

比如盒子里是 ?[3,2,2,3]?,要去掉 3,操作后盒子前兩位變成 ?[2,2]?,返回剩下 2 個。



方法一 : 嵌套循環移位法

int removeElement(int* nums, int numsSize, int val)?
{int i,j;for(i = 0;i<numsSize; ){if(nums[i]==val){// 當找到要移除的元素時,將后面元素逐個向前移位for(j = i;j<numsSize-1;j++)?{nums[j] = nums[j+1];}numsSize--;?//覆蓋掉當前要移除的元素,同時將數組有效長度numsSize減1}else{i++;?}}return numsSize;
}

思路:

- 外層 for?循環遍歷數組,循環條件中?i?不直接自增,根據元素是否等于?val?決定后續操作。

- 當發現?nums[i]?等于?val?時,通過內層 for?循環將 i?位置之后的所有元素依次向前移動一

,覆蓋掉當前要移除的元素,同時將數組有效長度 numsSize?減 1;若?nums[i]?不等于

val,則 ?i??正常自增,繼續遍歷下一個元素。

- 最終返回的 numsSize?就是數組中不等于 val?的元素數量,且數組前 numsSize?個元素已更

新為不含 val?的結果。

時間復雜度:

- 最壞情況下,根據兩個 for 循環, 可以得出時間復雜度為 O(n^2) ,其中 n?是數組 nums?的初

始長度 。

- 最好情況下,數組中沒有等于?val?的元素,外層循環只需遍歷一次數組,時間復雜度為

O(n) 。

取最壞的結果,所以第一種解法的時間復雜度為 O(n^2)。

空間復雜度:

- 整個過程只使用了有限的幾個額外變量(?i?、?j??等 ),沒有額外開辟大量數據存儲空間,

空間復雜度為 O(1) ,屬于原地操作。

方法二 : 借助數組法

int removeElement(int* nums, int numsSize, int val) 
{// 動態分配一個與原數組大小相同的臨時數組,處理 numsSize 為 0 的情況避免非法int* tmp = (int*)malloc(numsSize * sizeof(int));   if(tmp == NULL){return 0;}int index = 0;  // 記錄新數組 tmp 的下標,用于存放不等于 val 的元素for(int i = 0;i<numsSize;i++){if(nums[i]!=val){tmp[index] = nums[i];index++;}}// 將臨時數組中有效元素(不等于 val 的元素)拷貝回原數組前 index 個位置for(int i = 0;i<index;i++){nums[i] = tmp[i];}free(tmp);  // 釋放臨時數組內存,避免內存泄漏return index;
}

思路:

- 首先動態分配一個和原數組 nums?大小相同的臨時數組?tmp,用于存儲不等于 val?的元

素。若內存分配失敗(?tmp == NULL??),直接返回 0。


- 遍歷原數組 ?nums??,當遇到元素不等于 ?val??時,將其存入臨時數組 tmp?中,同時

用?index??記錄 ?tmp??中有效元素的個數(即下標 )。


- 遍歷結束后,把臨時數組 ?tmp??中存儲的有效元素(共 ?index??個 )拷貝回原數組nums?的

前 index?個位置,最后釋放臨時數組 tmp?的內存,避免內存泄漏,返回 index??,即原數組中

不等于 val?的元素數量。

時間復雜度:

- 遍歷原數組 ?nums??是一個 O(n) 的操作(?n??為數組初始長度 ?numsSize??),將臨時數組元

素拷貝回原數組也是一個 O(k) 的操作(?k??為不等于 ?val??的元素數量,最大為 ?n??),總的

時間復雜度為 O(n) ,因為 O(n + k) 中 ?k??最大不超過 ?n??,可簡化為 O(n)

空間復雜度:

- 額外動態分配了一個大小為 ?numsSize??的臨時數組 ?tmp??,所以空間復雜度為 O(n)?

我們可以明確的觀察到,第二種方法的時間復雜度比第一種方法的時間復雜度更簡單,但是空間復
雜度比第一種解法的空間復雜度更復雜,所以第二種方法比第一種方法就是采用了空間換時間的做

方法三?:??雙指針法(推薦的高效原地算法 )

int removeElement(int* nums, int numsSize, int val) 
{int dst = 0,src = 0; while(src < numsSize){// 當 src 指向元素不等于 val 時,將其賦值到 dst 位置,dst 后移if(nums[src] != val) {nums[dst] = nums[src];dst++;}src++; }return dst;
}

思路:

- 定義兩個指針(這里用變量 dst 和 src?模擬指針功能 ),src?用于遍歷原數組?nums??,逐個

檢查元素;?dst??用于標記新數組(即處理后不含 val?的數組部分 )的最后一個位置。


- 遍歷過程中,當 ?nums[src]??不等于 ?val??時,說明該元素是需要保留的,將其賦值到

nums[dst]?的位置,然后 dst?自增 1,指向下一個要填充的位置;不管 nums[src]?是否等于

?val?,src?都要自增 1 ,繼續遍歷下一個元素。


- 當 ?src??遍歷完整個數組(?src >= numsSize??)時,?dst??的值就是原數組中不等于 ?val??的

元素數量,且原數組前 ?dst??個元素已經是處理后不含 ?val??的結果。

時間復雜度:

- 只需遍歷一次原數組 ?nums??,?src??從 0 走到 ?numsSize - 1??,循環執行 ?numsSize??次,

所以時間復雜度為 O(n) ,其中 ?n??是數組 ?nums??的初始長度 。

空間復雜度:

- 只使用了常數個額外變量(?dst?、?src??),沒有額外開辟大量數據存儲空間,空間復雜度

為 O(1) ,屬于高效的原地算法。

通過第三種方法,我們可以觀察到第三種方法比前兩種方法都更加簡單。時間復雜度比第一種方法
更簡單,空間復雜度比第二種方法更簡單。
在實際開發中,優先推薦 雙指針法 ,它在時間和空間復雜度上都更優,能高效解決問題;嵌套循
環移位法在數據量小的時候可以用,但數據量大時性能不佳;借助額外數組法一般不是最優選擇,
除非有特殊場景需求(比如不能修改原數組內容,只是臨時拷貝處理等,但本題要求原地操作,它
其實不太契合題目 “原地” 要求,只是一種思路 ) 。

2.例題2:刪除有序數組中的重復項

例題來源(力扣) : https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/
這道題也可以使用雙指針的解題方法來寫。并且使用雙指針能夠最大程度的簡化時間和空間復雜
度。下面我們來看一下雙指針的具體解法。
給非嚴格遞增有序數組 nums ,原地刪除重復元素,使每個元素僅出現一次,保持相對順序,返回
新長度 k ,且需保證 nums ?前 k ?個元素為去重后的唯一元素。

方法 : 雙指針解法

int removeDuplicates(int* nums, int numsSize) {// dst 初始指向第 1 個唯一元素應在的位置(初始為 0)int dst = 0, src = dst + 1; // src 遍歷整個數組,找后續元素while (src < numsSize) { // 條件 1:當前 src 元素與 dst 元素不同(需保留 src 元素)// 條件 2:++dst != src(嘗試移動 dst 后,判斷是否與 src 位置重疊)if (nums[src] != nums[dst] && ++dst != src) { // 將 src 元素放到 dst 位置,保證前 dst+1 個元素唯一nums[dst] = nums[src]; }// src 繼續向后遍歷src++; }// dst 是最后一個唯一元素的下標,長度為下標 + 1return dst + 1; 
}

思路(以 ?nums = [1,1,2]??為例 ):

1.?初始狀態:?dst = 0?(指向第一個 ?1??),?src = 1?(指向第二個 ?1??)。

2.?第一次循環:?nums[src] == nums[dst]?(都是 1?),足?nums[src]!=nums[dst]?,?src++?→

src = 2?。

3.?第二次循環:?nums[src] = 2??≠ ?nums[dst] = 1?,執行 ?++dst?(?dst = 1??),判斷 ?dst !=

src?(?1 != 2??→ 成立 ),執行 ?nums[1] = 2?,數組變為 ?[1,2,2]?;?src++??→ ?src = 3?(退出

循環 )。

4.?返回結果:?dst + 1 = 2?,與題目要求一致。

復雜度分析:

時間復雜度:

- 核心邏輯:?src??從 ?1??遍歷到 ?numsSize - 1?,僅遍歷數組一次。

- 無論數組多長,循環次數為 ?numsSize - 1?(?src??移動次數 ),因此時間復雜度為

?O(n)(?n??為numsSize?,即數組長度 )。

空間復雜度:

- 函數僅使用 ?dst?、?src??兩個額外變量,未動態分配內存(如 ?malloc??)。

- 額外空間占用與數組長度無關,始終為常數,因此空間復雜度為 ?O(1)?(原地算法 )。

對于本地來說,雙指針法就是最優的解法。無論是從時間復雜度還是從空間復雜度來說,都是最優
答案。希望大家能夠好好理解這道題,好好理解雙指針的方法。

3.例題3:合并兩個有序數組

例題來源(力扣) :?https://leetcode.cn/problems/merge-sorted-array/description/
這道題的大概思路 : 給你兩個已經排好序(非遞減,即從小到大)的數組 nums1 ?和 nums2 ,但
nums1 ?后面有額外的空間(題目里說 nums1 ?初始長度是 m + n ,前 m ?個是有效元素,后 n ?個
是閑置的 0 ?)。你需要把 nums2 ?的元素合并到 nums1 ?里,并且合并后整個 nums1 ?仍然保持非
遞減順序,最后結果直接存在 nums1 ?里,不用返回新數組。
這道題有三種解法。下面我們一一來看。

方法一 :?先合并再冒泡排序

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{// 1. 合并 nums2 到 nums1 中int k = 0;for (int i = m; i < m + n; i++) {nums1[i] = nums2[k];k++;}// 2. 冒泡排序實現升序排列int len = m + n;for (int i = 0; i < len - 1; i++) {for (int j = 0; j < len - i - 1; j++) {if (nums1[j] > nums1[j + 1]) {// 交換元素int temp = nums1[j];nums1[j] = nums1[j + 1];nums1[j + 1] = temp;}}}
}

思路:

- 合并階段:利用循環,把 ?nums2??中的元素依次放到 ?nums1??中原本后面閑置的位置(即

從下標 ?m??開始的位置 ),完成兩個數組合并為一個數組的操作。


- 排序階段:采用冒泡排序,對合并后的 ?nums1??數組(長度為 ?m + n??)進行升序排序,通

過相鄰元素比較和交換,讓整個數組有序。

復雜度分析:

- 時間復雜度:合并操作是 ?O(n)?(?n??是 ?nums2??的長度 ),冒泡排序的時間復雜度是

?O((m + n)2)??。總的時間復雜度由冒泡排序主導,為?O((m + n)2)??,因為 ?(m + n)2??增長速度

比 ?n??快得多。


- 空間復雜度:整個過程只用到了幾個臨時變量(如 ?k?、?i?、?j?、?temp??等 ),沒有額外開

辟大量數據存儲空間,空間復雜度是 ?O(1)??。

如果大家不懂冒泡排序的話,小編之前在c語言的講解中詳細講解了冒泡排序的邏輯以及代碼內

容。有興趣的可以去看一下。

方法二 :?先合并再快速排序(借助 qsort? 排序法)

// 比較函數,用于 qsort,實現升序排序
int compare(const void *a, const void *b)
{return (*(int *)a - *(int *)b);
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{// 1. 合并 nums2 到 nums1 中int k = 0;for (int i = m; i < m + n; i++) {nums1[i] = nums2[k];k++;}// 2. 使用 qsort 對合并后的 nums1 進行升序排序qsort(nums1, m + n, sizeof(int), compare);
}

思路:

- 合并階段:和方法一一樣,通過循環將 ?nums2??的元素放到 ?nums1??后面的閑置位置,完

成合并。


- 排序階段:調用標準庫函數 ?qsort??對合并后的 ?nums1??數組進行升序排序。?qsort??內部一

般采用快速排序算法(優化版本,平均情況高效 ),根據自定義的 ?compare??比較函數(返

回 ?a - b??實現升序 )來排序。

復雜度分析:

- 時間復雜度:合并操作時間復雜度是 ?O(n)??。?qsort??基于快速排序,平均時間復雜度是

?O((m + n)log(m + n))??,最壞情況(比如數組完全有序等極端情況,快速排序退化為冒泡排

序邏輯,但實際 ?qsort??有優化,一般不考慮 )時間復雜度是 ?O((m + n)2)??,這里按平均情

況,總的時間復雜度由 ?qsort??主導,為 ?O((m + n)log(m + n))??。


- 空間復雜度:合并階段空間復雜度 ?O(1)??,?qsort??內部實現可能會用到遞歸棧或者額外的

輔助空間,不過空間復雜度平均情況是 ?O(log(m + n))?(遞歸棧深度 ),最壞情況是 ?O(m +

n)??,但整體相對于方法一在排序環節更高效。

qsort排序小編之前也在c語言的相關內容中講解過,有興趣的可以去了解一下。

方法三 :?雙指針(從后往前合并)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int l1 = m - 1;  // nums1 中有效元素(即原本要合并的元素)的最后一個下標int l2 = n - 1;  // nums2 中元素的最后一個下標int l3 = m + n - 1;  // 合并后 nums1 數組的最后一個下標// 同時遍歷 nums1 和 nums2 的有效元素(從后往前)while (l1 >= 0 && l2 >= 0) {if (nums1[l1] > nums2[l2]) {// nums1 當前元素更大,放到合并后數組的當前最后位置nums1[l3--] = nums1[l1--];} else {// nums2 當前元素更大或相等,放到合并后數組的當前最后位置nums1[l3--] = nums2[l2--];}}// 如果 nums2 還有剩余元素(說明 nums1 有效元素已經處理完了),直接放到 nums1 前面位置while (l2 >= 0) {nums1[l3--] = nums2[l2--];}
}

思路:

- 利用三個指針,?l1??指向 ?nums1??中原有有效元素的末尾,?l2??指向 ?nums2??元素的末

尾,?l3??指向合并后 ?nums1??數組的末尾。


- 從后往前比較 ?nums1??和 ?nums2??中的元素,把較大的元素放到 ?nums1??中? l3??指向的位

置,然后對應的指針向前移動。


- 當 ?nums1??原有有效元素處理完(?l1 < 0??),如果 ?nums2??還有剩余元素(?l2 >= 0??),

直接把這些元素依次放到 ?nums1??中剩下的位置,因為 ?nums2??本身是有序的,這樣就能保

證合并后整體有序。

復雜度分析:

- 時間復雜度:整個過程中,?l1??從 ?m - 1??往前遍歷到 ?-1??,?l2??從 ?n - 1??往前遍歷到

?-1??,?l3??從 ?m + n - 1??往前遍歷到 ?-1??,總的操作次數是 ?m + n??次,所以時間復雜度是

?O(m + n)??。


- 空間復雜度:只用到了幾個指針變量(?l1?、?l2?、?l3??),沒有額外開辟大量數據存儲空

間,空間復雜度是 ?O(1)??。

在實際應用中,雙指針法(方法三) 是最優解,充分利用了數組有序的條件,時間和空間復雜都
更優;方法一僅適合理解排序和合并邏輯,實際很少用;方法二借助庫函數簡化了排序實現,但效
率不如方法三且依賴庫?。
好了,以上就是關于順序表部分有關算法題的內容。這些題都運用了一個共同的方法,那就是雙指
針法。雙體執法在后面的算法題中屬于非常重要且非常常見的一種算術方法,大家一定要了解并且
熟練掌握它。

以后小編也會更新一些常見的算法題和一些比較重要的算法方法。喜歡的可以給小編留個關注,感
謝大家的觀看。

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

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

相關文章

逆向入門(9)匯編篇-bound指令的學習

看程序的時候碰到這么一行沒見過的代碼&#xff0c;簡單記錄一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]這里是用到了bound指令&#xff0c;這是 x86 匯編中的指令&#xff0c;用于檢查數組索引是否在有效范圍內。 指令解析 bound edx, qword ptr ds…

【web應用】若依框架中,使用Echarts導出報表為PDF文件

文章目錄前言一、Echarts準備工作1、查看是否安裝了Echarts2、Echarts導入script 中3、使用Echarts創建圖表二、報表制作打印html2canvas和jsPDF準備工作1、安裝html2canvas和jsPDF依賴包2、html2canvas和jsPDF引用到script中3、制作并打印報表三、導出結果前言 若依框架前端中…

優選算法 --(雙指針算法 1~8)

引言&#xff1a;此專欄為記錄算法學習&#xff0c;本專題作為算法學習的第一部分&#xff0c;優選算法專題共計100題&#xff0c;分為不同小模塊進行&#xff0c;算法學習需堅持積累&#xff0c;時代不會辜負長期主義者&#xff0c;僅以此句&#xff0c;與君共勉。 講解算法分…

XRDMatch代碼復現與分析報告

XRDMatch代碼復現與分析報告 1. 項目概述 XRDMatch是一個用于X射線衍射(XRD)數據匹配和分析的開源工具,由zhengwan-chem開發并托管在GitHub上。本項目旨在復現XRDMatch的核心功能,并對其實現進行詳細分析。 X射線衍射是材料科學中用于確定晶體結構的重要技術,通過分析衍射…

SpringAI×Ollama:Java生態無縫集成本地大模型實踐指南

摘要 隨著大語言模型(LLM)的普及,數據隱私和技術棧統一性成為企業級AI應用的核心挑戰。本文系統闡述如何通過SpringAI框架與Ollama本地化模型引擎的結合,構建安全高效的生成式AI應用。通過實戰案例解析配置優化、流式響應、工具調用等關鍵技術,為Java開發者提供零Python依…

從采購申請到報廢核銷:如何用數字化縫合企業物資管理的“斷點”?

在企業的日常運營中&#xff0c;物資管理是一項至關重要的工作。從采購申請到物資的入庫、使用&#xff0c;再到最終的報廢核銷&#xff0c;這一系列流程就像一條長長的鏈條&#xff0c;環環相扣。然而&#xff0c;在傳統管理模式下&#xff0c;這條鏈條上卻存在著諸多“斷點”…

AVL平衡二叉樹

01. 初始AVL樹 AVL樹是最早發明的自平衡二叉搜索樹。在AVL樹中&#xff0c;任何節點的兩個子樹的高度差&#xff08;平衡因子&#xff09;最多為1&#xff0c;這使得AVL樹能夠保持較好的平衡性&#xff0c;從而保證查找、插入和刪除操作的時間復雜度都是O(log n)。包含n個節點…

教育行業可以采用Html5全鏈路對視頻進行加密?有什么優勢?

文章目錄前言一、什么是Html5加密&#xff1f;二、使用Html5對視頻加密的好處三、如何采用Html5全鏈路對視頻進行加密&#xff1f;四、教育行業采用Html5全鏈路視頻加密有什么優勢&#xff1f;總結前言 面對優質課程盜錄傳播的行業痛點&#xff0c;教育機構如何守護核心知識產…

Vue3 tailwindcss

1、安裝tailwindcsspnpm i -D tailwindcss postcss autoprefixer # yarn add -D tailwindcss postcss autoprefixer # npm i -D tailwindcss postcss autoprefixer2、 創建TailwindCSS配置文件npx tailwindcss init -ptailwind.config.js/** type {import(tailwindcss).Config}…

提示工程:解鎖大模型潛力的核心密碼

以下是對Lilian Weng的提示工程權威指南&#xff08;原文鏈接&#xff09;的深度解析與博客化重構&#xff0c;融入最新行業實踐&#xff1a; 提示工程&#xff1a;解鎖大模型潛力的核心密碼 ——從基礎技巧到工業級解決方案全解析 一、重新定義人機交互范式 傳統編程 vs 提示…

Python3郵件發送全指南:文本、HTML與附件

在 Python3 中&#xff0c;使用內置的 smtplib 庫和 email 模塊發送郵件是一個常見的需求。以下是更詳細的實現指南&#xff0c;包含各種場景的解決方案和技術細節&#xff1a;一、發送純文本郵件的完整實現準備工作&#xff1a;確保已開通 SMTP 服務&#xff08;各郵箱開啟方式…

CSS和CSS3區別對比

CSS&#xff08;層疊樣式表&#xff09;與CSS3&#xff08;CSS的第三個版本&#xff09;的區別主要體現在功能擴展、語法特性以及應用場景等方面。以下是兩者的核心對比&#xff1a; 一、核心概念與版本關系CSS&#xff1a;是基礎樣式表語言&#xff0c;用于分離網頁內容與樣式…

JVM--監控和故障處理工具

一、命令行工具 1. jps (Java Process Status) 作用&#xff1a;列出當前系統中所有的 Java 進程 常用命令&#xff1a; jps -l # 顯示進程ID和主類全名 jps -v # 顯示JVM啟動參數 輸出示例&#xff1a; 1234 com.example.MainApp 5678 org.apache.catalina.startup.Bootstra…

推薦 7 個本周 yyds 的 GitHub 項目。

01.開源的 CRM 軟件這是一個開源的客戶關系管理&#xff08;CRM&#xff09;系統&#xff0c;現在又 32.5K 的 Star。為企業和團隊提供比肩 Salesforce 等商業產品的功能&#xff0c;同時強調用戶自主權、數據自由與高度可定制性。開源地址&#xff1a;https://github.com/twen…

linux網絡編程之單reactor模型(一)

Reactor 是一種事件驅動的設計模式&#xff08;Event-Driven Pattern&#xff09;&#xff0c;主要用于處理高并發 I/O&#xff0c;特別適合網絡服務器場景。它通過一個多路復用機制監聽多個事件源&#xff08;如 socket 文件描述符&#xff09;&#xff0c;并在事件就緒時將事…

瀏覽器重繪與重排

深入解析瀏覽器渲染&#xff1a;重排(Reflow)與重繪(Repaint)的性能陷阱與優化策略作為一名前端開發者&#xff0c;你是否遇到過界面突然卡頓、滾動時頁面抖動或輸入框響應遲鈍&#xff1f;這些常見性能問題背后&#xff0c;往往是重排與重繪在作祟。本文將深入剖析瀏覽器渲染機…

day049-初識Ansible與常用模塊

文章目錄0. 老男孩思想-人脈的本質1. Ansible1.1 密鑰認證1.2 安裝ansible1.3 添加ansible配置文件1.4 配置主機清單文件&#xff08;Inventory&#xff09;1.5 測試1.6 ansible的模塊思想1.7 command模塊1.8 需求&#xff1a;每臺服務器的密碼都不同&#xff0c;怎么批量執行業…

力扣網編程134題:加油站(雙指針)

一. 簡介 前面兩篇文章使用暴力解法&#xff0c;或者貪心算法解決了力扣網的加油站問題&#xff0c;文章如下&#xff1a; 力扣網編程150題&#xff1a;加油站&#xff08;暴力解法&#xff09;-CSDN博客 力扣網編程150題&#xff1a;加油站&#xff08;貪心解法&#xff09…

XPath 語法【Web 自動化-定位方法】

&#x1f9ed; XPath 語法簡介&#xff08;Web 自動化核心定位手段&#xff09;一、XPath 是什么&#xff1f;XPath&#xff08;XML Path Language&#xff09;是用于在 XML/HTML 文檔中定位節點的語言&#xff0c;由 W3C 標準定義。瀏覽器支持的是 XPath 1.0。應用場景廣泛&am…

記一次 Linux 安裝 docker-compose

一.下載 1.手動下載 下載地址&#xff1a;https://github.com/docker/compose/releases 下載后&#xff0c;放在/usr/local/bin/目錄下&#xff0c;命名為&#xff1a;docker-compose 2.命令下載 sudo curl -L "https://github.com/docker/compose/releases/download/…