![](/img/trans.png)
[英]What is the time complexity of merging two sorted arrays into a larger sorted array?
[英]Merging two sorted arrays using two pointers method
我正在嘗試解決一個 leetcode 問題。
問題是合並兩個排序的 arrays:
輸入:
arr1 = [2,4,7,9]
arr2 = [1,3,5,11,13]
Output [1,2,3,4,5,7,9,11,13]
我的解決方案看起來像:
function mergeTwoSortedArrays(arr1, arr2){
let newArr = [];
let newArrSize = (arr1.length + arr2.length) - 1;
let i = arr1.length - 1;
let j = arr2.length - 1;
while(i >= 0 || j>=0){
if(arr1[i] > arr2[j]){
newArr[newArrSize] = arr1[i];
newArrSize--;
i--;
}
if(arr2[j] > arr1[i]){
newArr[newArrSize] = arr2[j];
newArrSize--;
j--;
}
}
return newArr;
}
let arr1 = [2,4,7,9 ]
let arr2 = [1,3,5,11,13];
console.log(mergeTwoSortedArrays(arr1,arr2));
這里的問題是它進入一個無限循環並退出。 我認為使用的 while 代碼是錯誤的,但有什么問題?
使用 for 循環的稍微不那么令人困惑的代碼:
function mergeTwoSortedArrays(arr1, arr2){
let newArr = [];
let newArrLength = (arr1.length -1 + arr2.length -1) ;
let ptr1 = 0;
let ptr2 = 0;
for(let i = 0; i< newArrLength; i++){ console.log(i)
if(arr1[ptr1] < arr2[ptr2]){ //1
newArr.push(arr1[ptr1]);
ptr1++;
}
if(arr2[ptr2] < arr1[ptr1]){ //2
newArr.push(arr2[ptr2]);
ptr2++;
}
if(arr1[ptr1] == arr2[ptr2] && ptr1 < arr1.length -1 && ptr2 < arr2.length-1){ //3
newArr.push(arr1[ptr1]);
newArr.push(arr2[ptr2]);
ptr1++;
ptr2++;
}
if((arr1[ptr1] == undefined || null) && arr2[ptr2]){ //4
newArr.push(arr2[ptr2])
ptr2++;
}
if((arr2[ptr2] == undefined || null) && arr1[ptr1]){ //5
newArr.push(arr2[ptr1])
ptr1++;
}
}
return newArr
}
let arr1 = [2,2,4,7,9 ]
let arr2 = [1,3,5,11,13,13,18,32,87,102];
console.log(mergeTwoSortedArrays(arr1,arr2));
1 和 2 是元素之間的簡單比較,並增加了將推送其元素的相應數組的指針。
3 是檢查 arrays 中的相等元素,並檢查我們是否沒有與undefined
合並。
4 & 5 是檢查是否有任何數組到達末尾,然后我們只需推送元素並增加 ptr。
您可以只使用 concat 和 sort,但如果您應該自己實現它:
function mergeTwoSortedArrays(arr1, arr2){
let newArr = [];
let i = arr1.length;
let j = arr2.length;
let newArrSize = i + j;
while(newArrSize > 0){
if(typeof arr2[j-1] == 'undefined' || (arr1[i-1] > arr2[j-1])){
console.log('-', i, arr1[i-1])
newArr[newArrSize-1] = arr1[i-1];
newArrSize--;
i--;
}else if(typeof arr1[i-1] == 'undefined' || (arr2[j-1] > arr1[i-1])){
console.log('j', j, arr2[j-1])
newArr[newArrSize-1] = arr2[j-1];
newArrSize--;
j--;
}
}
return newArr;
}
回答您的問題 - 並且沒有為您提供解決方案 - 您的循環的問題是i
將始終高於0
,與j
相同。 因此,它進入了一個無限循環。 為什么? 因為你只需要 rest 到其中任何一個的大約一半的數組長度。 您的數組長度可能為 8,並且只有 3 次點擊if
。
你覺得你怎么能阻止它?
使用...
擴展運算符進行合並和sort()
函數對 arrays 進行排序
var merged = [...arr1, ...arr2]
merged.sort((a,b)=>a-b)
console.log(merged)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.