概要
題目來源鏈接:https://leetcode-cn.com/problems/merge-sorted-array/
難度:簡單
類型:數組
題目
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。
說明:
初始化 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]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-sorted-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
分析
第一種算法,暴力破解,借用了單鏈表歸併遞增的思路。通過兩個指針i和j分別掃描數組nums1和nums2,比較nums1[i]和nums2[j]的值,將小的數保存到結果數組中,如果nums1[i]>nums2[j]那麼保存nums2[j],如果nums1[i]<nums2[j]那麼保存nums1[i],對應的指針都要增加,可能兩個數組中會存在未參與比較的值,那麼這些值比現有的結果數組的值都大,所以直接添加到結果數組result中即可。
第二種算法,思路是首先將nums1和nums2融合,即當作一個數組處理。然後遍歷nums1數組中的原nums2的元素,將其與原nums1的元素作比較,如果nums2的比較小則交換兩個元素的位置,最後即爲所得。
代碼
Java代碼
第一種算法:暴力破解
/**
* 合併兩個有序數組
*
* @param nums1 有序整數數組
* @param m 初始化nums1的元素數量
* @param nums2 有序整數數組
* @param n 初始化nums2的元素數量
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
int result[] = new int[m + n];// 創建一個新數組來放置合併後的結果
int i = 0, j = 0, k = 0;
while (i < nums1.length - n && j < nums2.length) {
if (nums1[i] < nums2[j]) {// 比較兩個數組中的元素值,如果num1[i]小
result[k] = nums1[i];// 那麼將nums[i]保存到result結果數組中
i++;// nums1的指針加1
k++;// result的指針加1
} else {// 如果nums1[i]大於等於的話nums2[j]的話
result[k] = nums2[j];// 就將小的數即nums2[j]保存到結果數組result中
j++;// nums2的指針加1
k++;// result的指針加1
}
}
while (i < nums1.length - n) {// 將nums1數組中剩下的全部添加到結果數組result中
result[k] = nums1[i];
i++;
k++;
}
while (j < nums2.length) {// 將nums2數組中剩下的全部添加到結果數組result中
result[k] = nums2[j];
j++;
k++;
}
for (int q = 0; q < result.length; q++) {// 再將result數組的值賦給nums1
nums1[q] = result[q];
}
}
第二種算法:
/**
* 合併兩個有序數組(第二種算法)
*
* @param nums1 有序整數數組
* @param m 初始化nums1的元素數量
* @param nums2 有序整數數組
* @param n 初始化nums2的元素數量
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 將num2合併到num1中
int j=0;
for (int i = m; i < nums1.length; i++) {// 循環將nums2的值添加到nums1數組中,當成一個數組來處理
nums1[i]=nums2[j];
j++;
}
for(int i=m;i<nums1.length;i++){// 循環遍歷nums1數組中的屬於nums2的元素
for(int q=0;q<i+1;q++){// 循環遍歷nums1數組中的屬於nums1的元素
if(nums1[i]<nums1[q]){// 比較兩個的值,如果nums1[i]<nums1[q]即nums2中的元素小於nums1中的元素,那麼交換二者的值
int temp=nums1[i];// 交換nums1[i]和nums1[q]
nums1[i]=nums1[q];
nums1[q]=temp;
}
}
}
}