dieyushi's Blog

ATOM Rss

leetcode刷题记录3

April 25 2013 , coding

昨天到今天一直没静下心来好好想想算法,导致这两天就做了一道题,太惭愧了。不过题目难度为5,想了好久的算法啊。

Median of Two Sorted Arrays

Find the k-th smallest number

  • 解题思路:
    • 有k个比目标更小的数,将k分成两份,一份在A的前端,一份在B的前端,设k = i + j
    • 如果A[i-1] > B[j-1],说明B前端的j个数不可能出现我们要找的数。
    • 同理,如果A[i-1] < B[j-1],说明A前端的i个数不可能出现我们要找的数。
    • 如果A[i-1] == B[j-1],那么A[i-1]或者B[j-1]就是我们要找的。
    • 考虑边界情况。如k==1, m==0
    • 重复以上步骤,直到返回。
  • 实现:
int findKthSmallest(int A[], int m, int B[], int n, int k) {
    if (m > n)
        return findKthSmallest(B, n, A, m, k);
    if (m == 0)
        return B[k-1];
    if (k == 1)
        return min(A[0], B[0]);

    int i = min(k/2, m), j = k - i;
    if (A[i-1] < B[j-1])
        return findKthSmallest(A+i, m-i, B, n, k-i);
    else if (A[i-1] > B[j-1])
        return findKthSmallest(A, m, B+j, n-j, k-j);
    else
        return A[i-1];
}

Find the Median

关于中位数的定义可以参考(这里)。

  • 实现:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
    int k = (m + n) /2;
    if ((m+n)%2)
        return findKthSmallest(A,m,B,n,k+1);
    else
        return (findKthSmallest(A,m,B,n,k)+findKthSmallest(A,m,B,n,k+1))/2.0;
}

参考

Leetcode博客上提供了更好的方法(链接),可以参考。

comments powered by Disqus