两个数组找第k小

图片说明

图片说明

图片说明

图片说明

图片说明

图片说明

class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int total = nums1.length + nums2.length;
        if(total%2==0) {
            int value1 = findKth(nums1 ,0 ,nums2 ,0 ,total/2+1);
            int value2 = findKth(nums1 ,0 ,nums2 ,0 ,total/2 );
            return (value1+value2)/2.0;

        }
        else 
            return findKth(nums1 ,0 ,nums2 ,0 ,total/2+1);
    }
    public static int findKth(int nums1[] , int i ,int []nums2 , int j ,int k) {
        if(nums1.length- i > nums2.length - j )return findKth(nums2, j, nums1, i, k);
        if(nums1.length == i)return nums2[j + k - 1];
        if(k==1)return Math.min(nums1[i],nums2[j]);
        int si = Math.min(i + k / 2,nums1.length);
        int sj = j + k /2 ;
        if(nums1[si-1]>nums2[sj-1]) {  //这一步处理得好 也能优化si的值   因为nums1[si-1]>nums2[sj-1] 就不用担心去删掉 nums1[si-1]  反着则删除一个数 k - (si - i)
            return findKth(nums1, i, nums2, j + k / 2, k - k / 2);
        }
        else return findKth(nums1, si, nums2, j, k - (si - i)); //si最大也是a.length
        }
}
全部评论
 这个地方改一下 第k小不一定在方框里面 但是去掉的数都是没有意义 的 
点赞 回复 分享
发布于 2019-10-09 00:10
public static int findKth(int a[] ,int i , int b[] , int j,int k) { if(a.length - i > b.length - j) return findKth(b,j,a,i,k); if(a.length==i)return b[j + k - 1]; if(k == 1) return Math.min(a[i], b[j]); int si = Math.min(a.length, i + k/2); int sj = j + k / 2; if(a[si-1]>b[sj-1]) return findKth(a, i, b, j + k/2, k - k/2); //核心判断 else return findKth(a,si,b,j,k-(si-i)); }
点赞 回复 分享
发布于 2019-10-11 08:45

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务