題解:給定兩個排序的整型數組nums1和nums2,將nums2合併到nums1成一個排序數組。你可以假設nums1中有足夠的空間(空間大於或等於m+n)來存放來自nums2的額外元素。nums1和nums2的初始空間分別是m和n。
分析:題目本身比較簡單,要求in-place處理數組,因此不能另外申請一個m+n的數組nums3。好在nums1有足夠的空間,但是如果從數組頭部開始merge的話,可能會覆蓋nums1中原來的元素。
因此,知道最終合併的長度爲m+n以後,從nums1的尾部開始merge,讀取nums1[m]和nums[n]的數值,比較誰大就把誰添加到nums1的m+n位,然後在逐步向前推進。
時間複雜度O(m+n),空間複雜度爲常數O(1)。
import java.util.Arrays;
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1;
for(; i >= 0 && j >= 0;){
if(nums1[i] > nums2[j]){
nums1[i + j + 1] = nums1[i];
i--;
}else{
nums1[i + j + 1] = nums2[j];
j--;
}
}
// 需要注意,當上面循環結束時,nums2有可能還有元素沒有merge到nums1中,因此需要單獨處理一下。
while(j >= 0){
nums1[j] = nums2[j];
j--;
}
}
public static void main(String[] args) {
int[] nums1 = {1,2,3,0,0,0,0};
int[] nums2 = {4,5,6,7};
merge(nums1, 3, nums2, 4);
System.out.println(Arrays.toString(nums1));
}
}