力扣(leetcode)
題目名稱:
合併兩個有序陣列
題目詳情:
給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。
說明:
初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
示例:
輸入:
nums1 = [1,8,9,15,0,0,0,0,0], m = 4
nums2 = [2,5,6,12,18], n = 5
輸出:
[1,2,5,6,8,9,12,15,18]
解法一:
class這種解法很簡單,也很容易理解。就是額外建立乙個陣列result,陣列的大小為m + n即所有排序元素的個數,用來往裡面從左到右、從小到大裝資料。建立三個指標,i 指向陣列nums1的第乙個元素,j 指向陣列nums2的第乙個元素,k 指向陣列result的第乙個位置。solution
else
}while(i
while(j
for(int s = 0; s < result.length; s++)}}
比較nums1和nums2的指標所指向的當前元素的大小,小的填入到result中 k 指向的位置,此時兩個指標都向前移動一位,重複當前操作——填資料。
直到nums1和nums2其中乙個陣列遍歷完了,此時另乙個未遍歷完的陣列中剩餘的數都大於result中的元素,將這些數依次加到result後面。
到現在,我們得到了乙個已經包含nums1和nums2中所有元素的排好序的陣列result,但是還沒有結束,因為我們所要做的是合併兩個陣列,也就是將nums2合併到nums1中,最後nums1是乙個合併好的、排好序的陣列,我們當前的nums1還不是。所以,我們還要更新一下nums1,將result中的元素拷貝到nums1中,至此nums1才是題目要求的樣子。
解法二:
class這種方法相對巧妙一點,沒有額外的建立陣列,減少了演算法的空間複雜度。讓我們來看一看這種解法的思路是什麼吧。solution
//將nums2陣列從下標0位置開始,拷貝到nums1陣列中,從下標0位置開始,長度為len2+1
system.arraycopy(nums2, 0, nums1, 0, len2 + 1);}}
解法一的思路是從小到大填數,以此相反,這種解法是從大到小填資料,是在陣列nums1上從後往前填數,選擇大的填。
while迴圈中,當陣列nums2中的元素都被填完後,nums1就排好序了;當nums1中的元素被填完,而nums2中的元素還有一些時,語句 system.arraycopy(nums2, 0, nums1, 0, len2 + 1); 就發揮作用了,會將nums2中剩餘的元素加到nums1中,使得nums1合併排序完成。
合併兩個有序陣列
例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...
合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 class solution def merge s...
合併兩個有序陣列
題目描述 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素...