簡體   English   中英

使用兩個指針方法合並兩個排序的 arrays

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM