LeetCode演算法題88:合併兩個有序陣列解析
阿新 • • 發佈:2018-12-18
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明:
- 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
這個題第一個想法是建立一個新的陣列,因為題目也沒有限定,建立新的陣列後直接逐個比較兩個陣列元素(需要設定兩個索引)然後放到新陣列中,最後再將新陣列內容放到num1中,但是這樣的話,空間複雜度提高了O(n),時間複雜度也變為O(2n),所以還是在原陣列上進行操作。在原陣列上進行操作時需要注意不能從前面進行操作,因為會破壞要比較的數字,所以只能從後往前遍歷,遍歷時方法是一樣的,需要設定三個索引,一個是num1前面要比較數字的索引,一個是num2的索引,還有一個是整個num1從後往前的索引,然後比較放入即可,需要注意的是,比較完之後一定會進行索引自減的操作,所以要注意不要超出操作邊界,判斷條件要充分考慮。 C++原始碼:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if (n>0)
{
int total = m + n;
int i=m-1, j=n-1, k=total-1;
while (total--)
{
if (i<0||(j>=0&& nums1[i]<nums2[j]))
nums1[k--] = nums2[j--];
else
nums1[k--] = nums1[i--];
}
}
}
};
python3原始碼:
class Solution:
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""
nums1[m:] = nums2[:]
nums1.sort()
python由於使用的是list,list有好的方法可以直接排序,所以只要兩個列表拼起來,用sort()方法排序即可,這個不涉及演算法,只是對語言掌握的練習,演算法還是看C++程式碼。