【LintCode題集】Q6、Q64,lintcodeq6q64

來源:互聯網
上載者:User

【LintCode題集】Q6、Q64,lintcodeq6q64

  最近開始刷LintCode上的題目,先從標籤為容易的開始刷。今天刷的這兩題目差不多為同一類型的題目,都是為按照一定的規則合并兩個已經有序的數組。

  

[Q6]

描述:

  合并兩個排序的整數數組A和B變成一個新的數組。

  範例:

  給出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

思路:

  題目的方法原型為:

1 public int[] mergeSortedArray(int[] A, int[] B) {}

  所以即從A和B數組中一次取數比較大小,將其中較小者放入新的數組C。

  當其中一個數組已經全部取出,則將剩餘一個數組中的數全部放入數組C中。

  在歸併排序中,當把一個序列分解為若干個子序列之後,正是通過遞迴的合并子序列來完成排序。

實現:

 

 1 public int[] mergeSortedArray(int[] A, int[] B) { 2         // Write your code here 3  4         int[] C = new int[A.length + B.length]; 5  6         int indexa = 0;  //表示a數組的索引位置 7         int indexb = 0;  //表示b數組的索引位置 8         int indexc = 0;  //表示c數組的索引位置 9 10         //當某個數組已經全部合并進新的數組的時候跳出迴圈11         while( ! ((indexa == A.length) || (indexb == B.length))){12             if(A[indexa] <= B[indexb]){13                 C[indexc ++] = A[indexa ++];14             }15             else{16                 C[indexc ++] = B[indexb ++];17 18             }19         }20         //A數組還有剩餘元素21         while(indexa < A.length){22             C[indexc ++] = A[indexa ++];23         }24         //B數組還有剩餘元素25         while(indexb < B.length){26             C[indexc ++] = B[indexb ++];27         }28 29         return C;30 31 }

 

[Q64]

描述:

  合并兩個排序的整數數組A和B變成一個新的數組。

  你可以假設A具有足夠的空間(A數組的大小大於或等於m+n)去添加B中的元素。

  範例:

  給出 A = [1, 2, 3, empty, empty], B = [4, 5]

  合并之後 A 將變成 [1,2,3,4,5]

思路:

  題目的方法原型為:

1 public void mergeSortedArray(int[] A, int m, int[] B, int n) {}

 

  從題目函數原型和題目描述可以看出,這次在合并的時候是在A數組的基礎上進行合并,A數組的大小大於或等於A+B的大小,所以可以將B數組合并到A數組中。

  考慮兩種情況:

  1 當B中的某個元素已經比A中的最後一個元素還要大時,此時不需要再繼續比較了,直接將B中包括當前元素的剩餘元素全部插入到A數組最後。

  2 當B中的第x元素通過比較插入到了A數組的y位置上,則第x + 1 元素直接從y + 1 位置開始繼續比較,前面的無需比較。

  此題目比上面的題目還要多增加一個步驟,因為是在A數組上進行插入,所以插入之後,插入位置以後的元素需要往後移動一個位置,涉及到一個移動操作。

實現:

 1  public void mergeSortedArray(int[] A, int m, int[] B, int n) { 2         int indexa = 0 ;   //  標識A數組的遍曆位置 3         int indexb = 0 ;   //標識B數組的遍曆位置 4         int lastIndex = m - 1  ;  //標識A數組中最後的位置 5  6         while ( (indexa <= lastIndex) && (indexb <= n - 1) ) { 7             if(B[indexb] < A[indexa]){ 8                 //這個題目第一此提交出現了錯誤, 錯誤原因是下面的for迴圈中應該是i -- ,  手滑寫成了 i ++ 9                 for(int i = lastIndex ; i >= indexa ; i --){10                     A[i + 1] = A [i] ;11                 }12                 A[indexa ++] = B[indexb ++];13                 lastIndex ++ ;14             }15             else{16                 indexa ++ ;  17             }18         }19         while(indexb <= n - 1 )  {20             A[++ lastIndex] = B[indexb ++] ;21         }22 }

 

總結:

  有關於數組的操作,大多可以用過設定不同變數,來標識數組中的不同位置,從而可以進行不同的操作。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.