[LeetCode] Median of two sorted arrays.

我也不想一開始就刷這道題,只是看順序在那兒,就花樣做死了一把。。作爲這麼經典的題,自己裸想是一點idea都木有的。 網上這道題的討論成千上萬,所以重點變成找個比較合適的答案看懂,理解然後自己默寫出來。 這個問題的關鍵在將它轉化成找第K大的數,然後如果是兩數組長度之和是奇數,就找中間那個,如果是偶數就找兩次,再平均。而如果像1337大神那樣想一次考慮到數組長度之和爲奇偶數的情況,解法太複雜,不適合初學者,果斷放棄。而找到第K大的數則相對簡單一點,每次在兩數組中各取第K/2個數進行比較,總能去掉K/2個數。 剩下的坑就只剩邊界條件了,我差點就被邊界條件給坑死了。 總之這道題刷的很血淚,一步一跪,也算是見識到了LeetCode的厲害。
public class Solution {
  public double findMedianSortedArrays(int A[], int B[]) {
    int m = A.length, n = B.length;
    int total = m + n;
    if ((total & 0x1) == 0x1){
      return find(A, B, total/2); //start from 0. 
    }
    return (find(A, B, total/2 - 1) + find(A, B, total/2)) / 2.0;
  <span style="font-family: Arial, Helvetica, sans-serif;">}</span>
    
	
  private double find(int A[], int B[], int k){
    if (A.length > B.length) return find(B, A, k); //always deal with the first array is shorter. 
    if (A.length == 0) return B[k];
    if (k == 0) return Math.min(A[0], B[0]);
    int i = Math.min(k/2, A.length -1), j = k - (i + 1); // when A = {1}, B = {1}, k = 1, then i = 0, j must be 0!  
    if (A[i] < B[j]){
      return find(Arrays.copyOfRange(A, i + 1, A.length), B, k - (i + 1)); // dump {A[0] ... A[i]}, so k minus (i + 1).  
    } else if (A[i] > B[j]){
      return find(A, Arrays.copyOfRange(B, j + 1, B.length), k - (j + 1));
    } else {
      return A[i]; // because there is i elements before A[i] and j elements before B[j], and i + j = k -1, 
                   //So there is already k - i element before A[i] and B[j], and A[i] == B[j], so we just return either A[i] or B[j].  
    }
  }
	
}
另外的教訓是不要偷懶想copy自己的code片段,很容易copy完不改,又會出一堆錯誤!!
邊界條件的經驗:自己run一些例子,從空的開始,找幾個corner case跑一跑,不要急着提交!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章