4.寻找两个有序数组的中位数

1.oc 复杂度O(m+n)

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5

//该解法时间复杂度为O(m+n),不好
- (void)viewDidLoad {
    [super viewDidLoad];
    double result = [self findMedianSortedArrays:@[@"1",@"2"] :@[@"3",@"4"]];
    NSLog(@"%lf",result);
}

- (double)findMedianSortedArrays:(NSArray *)a1 :(NSArray*)a2 {
    NSMutableArray *a = [[NSMutableArray alloc]init];
    int m = a1.count;
    int n = a2.count;
    int i = 0,j = 0;
    while (i<m && j<n) {
        if ([a1[i] intValue] < [a2[j] intValue]) {
            [a addObject:a1[i]];
            i++;
            
        } else {
            [a addObject:a2[j]];
            j++;
           
        }
    }
    while (i<m) {
        [a addObject:a1[i]];
        i++;
    }
    while (j<n) {
        [a addObject:a2[j]];
        j++;
    }
    
    
    if (a.count % 2 == 0) {
        return ([a[a.count/2] doubleValue] + [a[a.count/2-1] doubleValue])/2;
    } else {
        return [a[a.count/2] doubleValue];
    }
    
    
}

@end

2.java 复杂度O(log(min(m,n)))

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        if (m > n) {    //交换nums1和nums2,交换m和n,使m<=n,为了保证j>0
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
            int tmp = m;
            m = n;
            n = tmp;
        }
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin +iMax) / 2;
            int j = halfLen - i;//为了满足中位数划分过的左右两边的数组个数相等,或左边比右边多一个
            if (i < iMax && nums2[j-1] > nums1[i]) {
                iMin = i + 1; // i is too small
            } else if (i > iMin && nums1[i-1] > nums2[j]) {
                iMax = i - 1; // i is too big
            } else { // i is perfect
                int maxLeft = 0;
                if(i == 0) {maxLeft = nums2[j-1];}
                else if(j == 0) {maxLeft = nums1[i-1];}
                else {maxLeft = Math.max(nums1[i-1], nums2[j-1]);}
                
                if((m+n)%2 == 1) {return maxLeft;}//奇数
                
                int minRight = 0;
                if (i == m) {minRight = nums2[j];}
                else if (j == n) {minRight = nums1[i];}
                else {minRight = Math.min(nums1[i], nums2[j]);}
                
                return (maxLeft + minRight) / 2.0;
            }
        }
        return 0.0;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容