摘要:此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn)當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解目的是為了更方便快捷的記憶和回憶算法重點(diǎn)不用每次都重復(fù)看題解畢竟算法不是做了一遍就能完全記住的所
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解.
目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容).
關(guān)于本專欄所有題目的目錄鏈接, 刷算法題目的順序/注意點(diǎn)/技巧, 以及思維導(dǎo)圖源文件問題請(qǐng)點(diǎn)擊此鏈接.
想進(jìn)大廠, 刷算法是必不可少的, 歡迎和博主一起打卡刷力扣算法! 博主同步更新了算法視頻講解, 更易于理解, 不想看文章的 歡迎來(lái)看!
關(guān)注博主獲得題解更新的最新消息!!!
這是最容易想到的方法: 先將數(shù)組nums2放進(jìn)數(shù)組nums1的尾部, 然后直接對(duì)整個(gè)數(shù)組進(jìn)行排序. 實(shí)現(xiàn)起來(lái)也是非常簡(jiǎn)單的, 但時(shí)間復(fù)雜度和空間復(fù)雜度都很高, 畢竟用到了排序算法, 建議面試時(shí)候千萬(wàn)別寫這種題解, 不然可能直接就回去等通知了!
方法一沒有利用數(shù)組nums1與nums2已經(jīng)被排序的性質(zhì), 為了利用這一性質(zhì), 可以使用雙指針方法, 將兩個(gè)數(shù)組看作隊(duì)列, 每次從兩個(gè)數(shù)組頭部取出比較小的數(shù)字放到結(jié)果中, 這時(shí)有個(gè)注意點(diǎn): 必須當(dāng)兩個(gè)數(shù)組的指針都到達(dá)尾部時(shí), 算法才算結(jié)束, 這點(diǎn)和下面的方法還是有點(diǎn)區(qū)別的, 需要注意一下.
最后一個(gè)小的注意點(diǎn)就是在python中的語(yǔ)法: nums1[:] = sorted, 它表示對(duì)nums1從頭到尾切片, 然后進(jìn)行一一賦值, 相當(dāng)于進(jìn)行了深拷貝.
方法二中, 之所以要使用臨時(shí)數(shù)組變量, 是因?yàn)槿绻?strong>直接合并到數(shù)組nums1中, nums1中的元素可能會(huì)在取出之前被覆蓋.
觀察可知, nums1的后半部分是空的, 可以直接覆蓋而不會(huì)影響結(jié)果, 所以可以將指針設(shè)置為從后向前遍歷, 每次取兩者之中的較大者放進(jìn)nums1的最后面, 這樣就完美的解決了被覆蓋的問題. 下面是合理性的證明, 感興趣的可以看一下.
嚴(yán)格來(lái)說,在此遍歷過程中的任意一個(gè)時(shí)刻,nums1數(shù)組中有m?p1?1個(gè)元素被放入nums1的后半部,nums2數(shù)組中有n?p2?1個(gè)元素被放入nums1的后半部,而在指針p1的后面,nums1數(shù)組有m+n?p1?1個(gè)位置。由于m+n?p1 ?1≥m?p1 ?1+n?p2 ?1 等價(jià)于 p2≥?1永遠(yuǎn)成立,因此p1后面的位置永遠(yuǎn)足夠容納被插入的元素,不會(huì)產(chǎn)生p1的元素被覆蓋的情況
最后有個(gè)注意點(diǎn), 之前我們說到方法二終止的條件是: 兩個(gè)指針都遍歷到了數(shù)組結(jié)尾, 但是在這種方法中, 并不需要兩個(gè)指針都遍歷到開頭, 只需要nums2空了, 遍歷就結(jié)束了, 不用考慮nums1, 因?yàn)榇藭r(shí)nums1中剩下的元素都是小于nums2的最小元素的, 且它們的順序本來(lái)就是排好的, 所以在代碼上相較于方法二有了一些簡(jiǎn)化的操作. 具體可以看兩者代碼的不同.
這是在面試中可能會(huì)被問到的進(jìn)階問題, 解決的方法是: 在方法三的基礎(chǔ)上, 因?yàn)槭怯行虻? 每次比較完兩個(gè)值后判斷前一個(gè)放進(jìn)數(shù)組里的值是不是和這次將要放進(jìn)數(shù)組的值相等就行了, 如果相等的話這一步比較出來(lái)的值就不放進(jìn)數(shù)組.
但其實(shí)這樣還是有點(diǎn)問題的: 如果是從大往小排, 如果邊排邊丟, 可能最后排好的部分全在nums1的后面, 仍然需要遍歷一次, 把所有數(shù)挪回左邊. 如果排完再丟, 也是遍歷一次, 感覺沒啥區(qū)別.
所以這兩種方式, 先排再丟 和 邊排邊丟 似乎是沒有區(qū)別的, 大家可以自己思考一下, 有問題歡迎留言評(píng)論.
# 直接合并后排序class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: nums1[m:] = nums2 nums1.sort()# 常規(guī)雙指針class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: sorted = [] p1, p2 = 0, 0 while p1 < m or p2 < n: # 同時(shí)到達(dá)尾部才結(jié)束 if p1 == m: sorted.append(nums2[p2]) p2 += 1 elif p2 == n: sorted.append(nums1[p1]) p1 += 1 elif nums1[p1] < nums2[p2]: sorted.append(nums1[p1]) p1 += 1 else: sorted.append(nums2[p2]) p2 += 1 nums1[:] = sorted # 對(duì)nums1從頭到尾切片, 相當(dāng)于進(jìn)行了深拷貝# 逆向雙指針class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: p1, p2 = m - 1, n - 1 tail = len(nums1) - 1 while p2 >= 0: if p1 < 0 or nums1[p1] <= nums2[p2]: nums1[tail] = nums2[p2] p2 -= 1 tail -= 1 else: nums1[tail] = nums1[p1] p1 -= 1 tail -= 1
// 直接合并后排序class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for (int i = 0; i != n; ++i) { nums1[m + i] = nums2[i]; } Arrays.sort(nums1); }}// 常規(guī)雙指針class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p1 = 0, p2 = 0; int[] sorted = new int[m + n]; int cur; while (p1 < m || p2 < n) { // 同時(shí)到達(dá)尾部才結(jié)束 if (p1 == m) { cur = nums2[p2++]; } else if (p2 == n) { cur = nums1[p1++]; } else if (nums1[p1] < nums2[p2]) { cur = nums1[p1++]; } else { cur = nums2[p2++]; } sorted[p1 + p2 - 1] = cur; } for (int i = 0; i != m + n; ++i) { nums1[i] = sorted[i]; } }}// 逆向雙指針class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int tail = nums1.length - 1; int p1 = m - 1; int p2 = n - 1; while (p2 >= 0) { // 只要p2到達(dá)開頭就結(jié)束 if (p1 < 0 || nums1[p1] <= nums2[p2]) { nums1[tail--] = nums2[p2--]; } else { nums1[tail--] = nums1[p1--]; } } }}
我的更多精彩文章鏈接, 歡迎查看
各種電腦/軟件/生活/音樂/動(dòng)漫/電影技巧匯總(你肯定能夠找到你需要的使用技巧)
力扣算法刷題 根據(jù)思維導(dǎo)圖整理筆記快速記憶算法重點(diǎn)內(nèi)容(歡迎和博主一起打卡刷題哦)
計(jì)算機(jī)專業(yè)知識(shí) 思維導(dǎo)圖整理
最值得收藏的 C++ 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(清華大學(xué)鄭莉版), 東南大學(xué)軟件工程初試906科目
最值得收藏的 算法分析與設(shè)計(jì) 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(北大慕課課程)
最值得收藏的 數(shù)據(jù)結(jié)構(gòu) 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(王道考研), 附帶經(jīng)典題型整理
最值得收藏的 人工智能導(dǎo)論 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(王萬(wàn)良慕課課程)
最值得收藏的 數(shù)值分析 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(東北大學(xué)慕課課程)
最值得收藏的 數(shù)字圖像處理 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(武漢大學(xué)慕課課程)
紅黑樹 一張導(dǎo)圖解決紅黑樹全部插入和刪除問題 包含詳細(xì)操作原理 情況對(duì)比
各種常見排序算法的時(shí)間/空間復(fù)雜度 是否穩(wěn)定 算法選取的情況 改進(jìn) 思維導(dǎo)圖整理
人工智能課件 算法分析課件 Python課件 數(shù)值分析課件 機(jī)器學(xué)習(xí)課件 圖像處理課件
考研相關(guān)科目 知識(shí)點(diǎn) 思維導(dǎo)圖整理
考研經(jīng)驗(yàn)–東南大學(xué)軟件學(xué)院軟件工程(這些基礎(chǔ)課和專業(yè)課的各種坑和復(fù)習(xí)技巧你應(yīng)該知道)
東南大學(xué) 軟件工程 906 數(shù)據(jù)結(jié)構(gòu) C++ 歷年真題 思維導(dǎo)圖整理
東南大學(xué) 軟件工程 復(fù)試3門科目歷年真題 思維導(dǎo)圖整理
最值得收藏的 考研高等數(shù)學(xué) 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(張宇, 湯家鳳), 附做題技巧/易錯(cuò)點(diǎn)/知識(shí)點(diǎn)整理
最值得收藏的 考研線性代數(shù) 全部知識(shí)點(diǎn)思維導(dǎo)圖整理(張宇, 湯家鳳), 附帶慣用思維/做題技巧/易錯(cuò)點(diǎn)整理
高等數(shù)學(xué) 中值定理 一張思維導(dǎo)圖解決中值定理所有題型
考研思修 知識(shí)點(diǎn) 做題技巧 同類比較 重要會(huì)議 1800易錯(cuò)題 思維導(dǎo)圖整理
考研近代史 知識(shí)點(diǎn) 做題技巧 同類比較 重要會(huì)議 1800易錯(cuò)題 思維導(dǎo)圖整理
考研馬原 知識(shí)點(diǎn) 做題技巧 同類比較 重要會(huì)議 1800易錯(cuò)題 思維導(dǎo)圖整理
考研數(shù)學(xué)課程筆記 考研英語(yǔ)課程筆記 考研英語(yǔ)單詞詞根詞綴記憶 考研政治課程筆記
Python相關(guān)技術(shù) 知識(shí)點(diǎn) 思維導(dǎo)圖整理
Numpy常見用法全部OneNote筆記 全部筆記思維導(dǎo)圖整理
Pandas常見用法全部OneNote筆記 全部筆記思維導(dǎo)圖整理
Matplotlib常見用法全部OneNote筆記 全部筆記思維導(dǎo)圖整理
PyTorch常見用法全部OneNote筆記 全部筆記思維導(dǎo)圖整理
Scikit-Learn常見用法全部OneNote筆記 全部筆記思維導(dǎo)圖整理
Java相關(guān)技術(shù)/ssm框架全部筆記
科技相關(guān) 小米手機(jī)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123624.html
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
摘要:此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn)當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解目的是為了更方便快捷的記憶和回憶算法重點(diǎn)不用每次都重復(fù)看題解畢竟算法不是做了一遍就能完全記住的所 ...
此專欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
閱讀 857·2021-11-22 11:59
閱讀 3273·2021-11-17 09:33
閱讀 2342·2021-09-29 09:34
閱讀 1977·2021-09-22 15:25
閱讀 1987·2019-08-30 15:55
閱讀 1346·2019-08-30 15:55
閱讀 561·2019-08-30 15:53
閱讀 3382·2019-08-29 13:55