本文由 發(fā)布,轉(zhuǎn)載請注明出處,如有問題請聯(lián)系我們! 發(fā)布時間: 2021-08-22【LeetCode】88. 合并兩個有序數(shù)組
加載中88. 合拼2個井然有序二維數(shù)組
知識要點:二維數(shù)組;排列;雙指針;
題型敘述
讓你2個按 非下降次序 排序的整數(shù)金額二維數(shù)組 nums1 和 nums2,另有兩個整數(shù)金額 m 和 n ,各自表明 nums1 和 nums2 中的原素數(shù)量。
你要 合拼 nums2 到 nums1 中,使合拼后的二維數(shù)組一樣按 非下降次序 排序。
留意:最后,合拼后二維數(shù)組不可由涵數(shù)回到,只是儲存在二維數(shù)組 nums1 中。為了更好地解決這類狀況,nums1 的原始長短為 m n,在其中前 m 個原素表明應(yīng)合拼的原素,后 n 個原素為 0 ,應(yīng)忽視。nums2 的長短為 n 。
實例
鍵入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
表述:必須合拼 [1,2,3] 和 [2,5,6] 。
合拼結(jié)果是 [1,2,2,3,5,6] ,在其中斜體字字體加粗標明的為 nums1 中的原素。
鍵入:nums1 = [1], m = 1, nums2 = [], n = 0
輸出:[1]
表述:必須合拼 [1] 和 [] 。
合拼結(jié)果是 [1] 。
打法一:排列
=這題非常簡單,能夠 立即把num2合拼到num1上,也就是將2個數(shù)組合并,隨后去排列;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i = m; i < m n; i ){
nums1[i] = nums2[i-m];
}
for(int i = 0; i < m n; i ){
for(int j = 0; j < m n-i-1; j ){
if(nums1[j] > nums1[j 1]){
int temp = nums1[j];
nums1[j] = nums1[j 1];
nums1[j 1] = temp;
}
}
}
}
}
打法二:雙指針
上邊沒有使用一個標準:2個二維數(shù)組全是排列好的,因此 能夠 界定2個表針,針對2個二維數(shù)組都從頭至尾解析xml。經(jīng)典的以室內(nèi)空間換時間;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] arr = new int[m n];
int index1 = 0, index2 = 0;
int index = 0;
while(index1 < m || index2 < n){
if(index1 == m){
arr[index ] = nums2[index2 ];
}else if(index2 == n){
arr[index ] = nums1[index1 ];
}else if(nums1[index1] <= nums2[index2]){
arr[index ] = nums1[index1 ];
}else if(nums1[index1] > nums2[index2]){
arr[index ] = nums2[index2 ];
}
}
for(int i = 0; i < m n; i ){
nums1[i] = arr[i];
}
}
}
標簽