• leetcode media of an sort array


    本题要求时间复杂度为log(m+n),不让合并用额外的空间:

    算法描述:

    1 选定两个数组A,B并计算长度,根据长度和m+n是偶数还是奇数,分为两种查找中位的方式;

    如果和为偶数:Value[(m+n)/2]+Value[(m+n)/2+1]

    如果为奇数:Value[(m+n)/2]

    2 然后通过迭代计算中位数

    通过假定A长度小于B,然后选择每个数组的中间k/2元素,如果A的中位数,小于B的中位数,则A中位数前面的元素都小于value(k),这样重新选择A的起始点,并减去k值为k-pa;如果,B中的小,这让B的长度减去pb,然后重新开始;

    重视让A的长度小于B的长度;

    k每次递减,m,n分别表示数组剩余长度;index1,index2分别表示前面去掉的元素个数;

    注意:边界问题:

    如果k为1:表示从新起始的元素开始的A,B第一个元素的较小值

    如果m为0;表示较小长度的数组已经分析完了,直接选择第二个数组制定位置的元素就可以

    package com.demo.acm;
    
    public class MedianOfTwo {
    
        private double findKth(int[] a,int m,int[] b,int n,int k,int index1,int index2){
            //System.out.println("m:"+m+" n:"+n+" k:"+k+" index1:"+index1+" index2:"+index2);
            if(m>n){
                return findKth(b,n,a,m,k,index2,index1);
            }
            if(m==0){
                //System.out.println("*");
                return b[index2+k-1];
            }
                
            if(k==1){
                //System.out.println("-"+index1+" "+index2);
                return Math.min(a[index1],b[index2]);
            }
                
            int pa=Math.min(k/2, m),pb=k-pa;
            if(a[index1+pa-1]<b[index2+pb-1]){
                return findKth(a,m-pa,b,n,k-pa,pa+index1,index2);
            }else if(a[index1+pa-1]>b[index2+pb-1]){
                return findKth(a,m,b,n-pb,k-pb,index1,index2+pb);
            }else{
                return a[index1+pa-1];
            }
        }
    
        public double findMedianSortedArrays(int[] A, int[] B) {
            int m = A.length;
            int n = B.length;
            int total = m + n;
            //System.out.println("A:"+A.length+" B:"+B.length);
            if ((total & 1) == 0) {
                return (findKth(A, m, B, n, total / 2,0,0) + findKth(A, m, B, n,
                        total / 2 + 1,0,0)) / 2;
            } else {
                return findKth(A, m, B, n, total / 2 + 1,0,0);
            }
        }
        public static void main(String[] args){
            MedianOfTwo media=new MedianOfTwo();
            int[] A={1};
            int[] B={5,6,7};
            System.out.println(media.findMedianSortedArrays(B, A));
        }
    }
  • 相关阅读:
    torchvision 之 transforms 模块详解
    图像的形状相关参数顺序
    卷积神经网络(CNN)
    OpenCV 图片基本操作
    Dataset 和 DataLoader 详解
    ARM开发各种烧写文件格式说明(ELF、HEX、BIN)结合KEIL环境的使用
    14 局部段描述符的使用
    一文看懂Linux内核!Linux内核架构和工作原理详解
    13 从保护模式返回实模式
    基于win10家庭版的docker安装
  • 原文地址:https://www.cnblogs.com/csxf/p/3653214.html
Copyright © 2020-2023  润新知