合併兩個有序陣列

2022-07-04 16:03:13 字數 1766 閱讀 9981

力扣(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

solution

else

}while(i

while(j

for(int s = 0; s < result.length; s++)}}

這種解法很簡單,也很容易理解。就是額外建立乙個陣列result,陣列的大小為m + n即所有排序元素的個數,用來往裡面從左到右、從小到大裝資料。建立三個指標,i 指向陣列nums1的第乙個元素,j 指向陣列nums2的第乙個元素,k 指向陣列result的第乙個位置。

比較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 中的元素...