題目出處
難度
Easy
題目分類
array, two-pointers
個人範例程式碼
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
while(m > 0 && n > 0){
if(nums1[m-1] >= nums2[n-1]){
nums1[m+n-1] = nums1[m-1];
m -= 1;
}
else{
nums1[m+n-1] = nums2[n-1];
n -= 1;
}
}
while(n > 0){
nums1[m+n-1] = nums2[n-1];
n -= 1;
}
}
};
說明
這題我們可以先注意題目的敘述:
最需要思考的部分在於「題目希望最後的結果直接儲存在 nums1 裡面」
雖然這樣的限制會使我們解題更加的「受到限制」,但反過來說,
其實這也是題目給我們「最大的提示」。
題目的 nums1 給的空間為 m+n,所以最後我們都會將所有的值擺入 nums1 中,
而因為我們可以無憂慮去更改的值為最後的 0,0,0… 部分
(因為這個值就算被改消失了,也不影響我們想計算的結果)
所以這邊可以推斷出一定要「從後面開始解」,「從最無痛的 0 開始取代」,
再來我們就可以來思考,什麼時候擺入 nums1的值? 什麼時候擺入 nums2 的值?
我們可以靠著題目所給的 m, n 來進行這樣的操作,透過值不斷擺入,
我們去移動 m, n 作為 index 的座標,即可順利完成此題目。
邊際情況處理
這題要注意的邊際情況為 m=0, n=0 的時候我們要怎麼處理,
而照題目的敘述,
- n=0 基本上對我們來說沒差,因為 m 控制的 nums1 即代表我們要的答案
- m=0 才是重點,如果還有剩餘的 n,都需要擺入 nums1 中,而位置索幸很好取得,
依然可以透過 m+n-1 算出
注意 index 細節,才是這題要考細心的部分
這題有很多 index 細節考驗著作答者的細心度,
包含:
- 迴圈的範圍僅限於 m, n > 0 時,其他需要進例外處理
- m-1, n-1 才是當下座標
- 要擺入的位置為 m+n-1
- 處理到 n > 0 就應該停下,而非 n >= 0
Reference
⭐ Leetcode 解題紀錄 ⭐ | 題型 | 資料結構 | Python Solution | C++ Solution | Note | |
---|---|---|---|---|---|---|
⭐BFS 相關題型 ⭐ | ||||||
104 | Maximum Depth of Binary Tree | BFS (分層) | Python | |||
94 | Binary Tree Inorder Traversal | BFS (分層) | Tree | Python | 內含 處理 Tree 樹問題的重點 | |
102 | Binary Tree Level Order Traversal | BFS (分層) | Tree | Python | ||
103 | Binary Tree Zigzag Level Order Traversal | BFS (分層) | Tree | Python | ||
107 | Binary Tree Level Order Traversal II | BFS (分層) | Tree | Python | ||
133 | Clone Graph | BFS (分層) | Graph | Python | Graph 的基本操作 #重要題型 | |
127 | Word Ladder | BFS (分層), DFS | Graph | Python | ||
[Lint] 127 | Topological Sorting | BFS (拓撲) | Python | 內有 indegree, outdegree 介紹 #重要題型 | ||
207 | Course Schedule | BFS (拓樸) | Graph | Python | ||
210 | Course Schedule II | BFS (拓樸) | Graph | Python | ||
[Lint] 892 | Alien Dictionary | BFS (拓樸) | Graph | Python | ||