Leetcode4(寻找两个正序数组的中位数)
题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
题解
如果对时间复杂度的要求有 log,通常都需要用到二分查找,这道题也可以通过二分查找实现。
debug半天写边界,还可以优化
明天优化一下,然后实现一下方法二
package com.example;class Solution {public int[] nums1,nums2;public double findMedianSortedArrays(int[] nums1, int[] nums2) {this.nums1=nums1;this.nums2=nums2;int n1=nums1.length,n2=nums2.length;if((n1+n2)%2==1){return find((n1+n2)/2+1);}return (find((n1+n2)/2+1)+find((n1+n2)/2))*1.0/2;}public int find(int k){int l1=0,l2=0;int n1=nums1.length,n2=nums2.length;while(true){if(l1==n1) return nums2[l2+k-1];if(l2==n2) return nums1[l1+k-1];if(k==1){return nums1[l1]>nums2[l2]?nums2[l2]:nums1[l1];}int mid=(k/2)-1;if(l1+mid>=n1&&n1<=n2){mid=n1-l1-1;}if(l2+mid>=n2&&n1>=n2){mid=n2-l2-1;}if(nums1[l1+mid]>=nums2[l2+mid]){l2+=mid+1;k-=mid+1;}else{l1+=mid+1;k-=mid+1;}}}
}