給你兩個有序整數數組 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]
思路一:
最樸素的解法就是將兩個數組合並之後再排序。該算法只需要一行(Java是2行),時間複雜度較差,爲O((n + m)\log(n + m))O((n+m)log(n+m))。這是由於這種方法沒有利用兩個數組本身已經有序這一點。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
System.arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代碼解釋:
Object src : 原數組
int srcPos : 從元數據的起始位置開始
Object dest : 目標數組
int destPos : 目標數組的開始起始位置
int length : 要copy的數組的長度
思路二:
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int len1 = m - 1;
int len2 = n - 1;
int len = m + n - 1;
while(len1 >= 0 && len2 >= 0) {
// 注意--符號在後面,表示先進行計算再減1,這種縮寫縮短了代碼
nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
}
// 表示將nums2數組從下標0位置開始,拷貝到nums1數組中,從下標0位置開始,長度爲len2+1
System.arraycopy(nums2, 0, nums1, 0, len2 + 1);
for (int i = 0; i < nums1.length; i++) {
System.out.println(nums1[i]);
}
}