[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跑一跑,不要急着提交!!

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