4、Median of Two Sorted Arrays

此题难度高,但是因为面试曾被问到,所以记录一下

Example

nums1 = [1 , 3]
nums2 = [2]
The median is 2.0
nums1 = [1 , 2]
nums2 = [3 , 4]
The median is (2 + 3)/2 = 2.5

解法
要寻找第k小的元素,那么总是保持数组A的当前元素(即A[a])为当前最小元素(如果不是,则交换A和B数组,使这一条成立),然后弹出该元素(即++a),然后再递归调用寻找第k-1小的元素。

这需要注意的地方在于:

A.length + B.length 为偶数的时候,中位数有两个,要取平均
A.length + B.length 为奇数的时候,中位数只有一个
public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length = nums1.length + nums2.length;
        if (length%2 == 1){
            return recrusive(nums1, nums2, 0, nums1.length-1, 0, nums2.length-1, length/2 + 1);
        } else {
            return (recrusive(nums1, nums2, 0, nums1.length-1, 0, nums2.length-1, length/2)+recrusive(nums1, nums2, 0, nums1.length-1, 0, nums2.length-1, length/2 + 1))/2.0;
        }
    }


    public double recrusive(int[] A, int[] B, int i, int i2, int j, int j2, int k){
        int m = i2-i+1;
        int n = j2-j+1;
        if (m > n) return recrusive(B, A, j, j2, i, i2, k);
        if (m == 0) {
            return B[j+k-1];
        }
        if (k == 1){
            return Math.min(A[i], B[j]);
        }
        int posA = Math.min(k/2, m);
        int posB = k-posA;
        if(A[i+posA-1] == B[j+posB-1]){
            return A[i+posA-1];
        }else if (A[i+posA-1] < B[j+posB-1]){
            return recrusive(A, B, i+posA, i2, j, j+posB-1, k-posA);
        }else {
            return recrusive(A, B, i, i+posA-1, j+posB, j2, k-posB);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容