leetCode 88 合併兩個有序陣列

2021-10-07 17:33:14 字數 1481 閱讀 6701

思路:因為兩個陣列是有序的,因此可以在nums1尾部插入乙個元素,再對左半部分進行掃瞄將插入的元素放在合適位置。

class

solution}}

public

void

exch

(int

a,int i,

int j)

}

思路:由於是歸併兩個有序陣列直接就可以想到歸併排序中的歸併操作,nums1為輸出陣列,將nums1nums2陣列中的值儲存到aux輔助陣列中,使用兩個指標ij指向左半邊開頭與右半邊開頭,從左向右掃瞄,取左半邊與右半邊中較小的依次放入nums1中。

class

solution

}}

思路:每次從nums2取出乙個元素,通過二分查詢查詢該元素在nums1中的插入位置,將該位置及之後原有的的元素向後移動一位,給新元素騰位置,再將新元素插入。

class

solution

for(

int j = i; j > lo; j--

) nums1[lo]

= nums2[i-m];}

}public

void

exch

(int

a,int i,

int j)

}

上面**中空間復制度為o(m+n)可以繼續優化,只複製nums1中的元素到乙個新陣列中

class

solution

if(i < m) system.

arraycopy

(nums1_copy, i, nums1, i+j, m+n-i-j);if

(j < n) system.

arraycopy

(nums2, j, nums1, i+j, m+n-i-j);}

}

上面**已經達到了最優的時間複雜度o(m+n),空間複雜度優化為了o(m),可以將指標指向陣列尾部從後往前遍歷,將較大的值放在nums1尾部

class

solution

//補充nums2缺失的元素,nums1=[0],m=0,nums2=[1],n=1這種情況

system.

arraycopy

(nums2,

0, nums1,

0, j+1);}}

合併陣列時可以從後往前複製,這樣可以減少移動次數

leetcode 88 合併兩個有序數

給定兩個有序整數陣列 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 我覺得這道題有點問題。假設 nums1 有足夠的空間...

LeetCode 88 合併兩個有序陣列

給定兩個有序整數陣列 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 解題思路 使用二分查詢演算法直接插入,極其簡潔,展示...

leetcode88 合併兩個有序陣列

def merge self,nums1,m,nums2,n 關鍵點是nums1原陣列的長度是m n,肯定要在nums1上操作效率高 如果正向比較的話移動次數很多,逆向的話不需要移動 注意m,n是以1開頭的 while m 0 and n 0 if nums1 m 1 nums2 n 1 如果num...