[刷题]Median of two Sorted Arrays

来源:互联网 发布:小米k歌软件 编辑:程序博客网 时间:2024/05/21 09:57

[LintCode]Median of two Sorted Arrays

class Solution {    /**     * @param A: An integer array.     * @param B: An integer array.     * @return: a double whose format is *.5 or *.0     */    public double findMedianSortedArrays(int[] A, int[] B) {        // 2015-4-21        if (A == null || B == null) {            return 0;        }        int len = A.length + B.length;        if (len == 0) {            return 0;        }                if (len % 2 == 0) {            // 偶数            return (findKth(A, B, 0, 0, len / 2)                 + findKth(A, B, 0, 0, len / 2 + 1)) / 2.0;            } else {            // 奇数            return findKth(A, B, 0, 0, len / 2 + 1);        }            }        // 在两个数组中找到第k大的数    private int findKth (int[] A, int[] B, int indexA, int indexB, int k) {        int lenA = A.length;        int lenB = B.length;        // 结束1:A中元素已全部被筛选掉        if (indexA == lenA) {            return B[indexB + k - 1];        }        // 结束2:B中元素已全部被筛选掉        if (indexB == lenB) {            return A[indexA + k - 1];        }        // 结束3:无论k是奇是偶,最后一定为1        if (k == 1) {            return Math.min(A[indexA], B[indexB]);        }                int mid = k / 2;        // 序号为index + k / 2 - 1的元素        int keyA = indexA + mid - 1 >= lenA ? Integer.MAX_VALUE : A[indexA + mid - 1];        int keyB = indexB + mid - 1 >= lenB ? Integer.MAX_VALUE : B[indexB + mid - 1];                // 每次筛掉k / 2个元素        if (keyA < keyB) {            // 从A筛掉k / 2            return findKth(A, B, indexA + mid, indexB, k - mid);        } else {            // 从B筛掉k / 2            return findKth(A, B, indexA, indexB + mid, k - mid);        }    }}


0 0
原创粉丝点击