当前位置: 首页 > article >正文

力扣题(3):寻找两个正序数组的中位数

官方的答案我勉强可以知道思路,但是让我敲代码我敲不出来,我只能做出来两个时间复杂度比较高的方法来完成这道题,具体的算法后续再看能不能更深层次的进行理解再更新吧:

package test004;

import java.util.Arrays;

public class findArraysMidNumber {
    public static void main(String[] args) {
        int[] nums1 = {1,3,3};
        int[] nums2 = {2,4,9};
        System.out.println(findMedianSortedArrays(nums1, nums2));
        System.out.println(findMedianSortedArrays2(nums1, nums2));
    }

    /**
     * 方法一:指针定位
     */
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n1 = nums1.length,n2 = nums2.length;
        //给两个数组定义指针
        int k1 = 0,k2 = 0;
        //中间数和中间数之前的数
        int pre = 0,current = 0;
        int totalLength = n1+n2;//总长度
        int middleIndex = totalLength/2;//因为索引是从0开始,所以不用考虑加一
        //遍历到中间数
        for (int i = 0; i <= middleIndex; i++) {
            //比较两个数组的相应位置的数字大小
            //那个数组的数字更小
            if (k1<n1 && (k2>=n2 || nums1[k1]<nums2[k2])){
                //就将那个数组指针当前指向的数字赋值给current
                current = nums1[k1];
                k1++;
            }else {
                current = nums2[k2];
                k2++;
            }
        }
        //判断奇偶数
        if (totalLength%2 == 0){//偶数
            return (pre+current)/2.0;
        }else {
            return current;
        }
    }

    /**
     * 方法二:合并数组
     */
    public static double findMedianSortedArrays2(int nums1[],int nums2[]){
        int ints[] = Arrays.copyOf(nums1,nums1.length+nums2.length);
        /**arraycopy()方法参数的概述
         * src:这是源数组,也就是要从哪个数组中复制元素。它是一个 Object 类型的参数,意味着可以传入任意类型的数组,如 int[]、char[]、String[] 等。
         * srcPos:表示源数组中开始复制元素的起始位置,索引从 0 开始计数。
         * dest:目标数组,即元素要复制到的数组。同样,它也是 Object 类型的参数,并且目标数组的类型要和源数组的类型兼容。
         * destPos:目标数组中开始粘贴元素的起始位置,索引同样从 0 开始。
         * length:要复制的元素个数。
         */
        System.arraycopy(nums2,0,ints,nums1.length,nums2.length);
        //通过Arrays.copyOf和System.arraycopy完成两个数组的合并
        //排序
        Arrays.sort(ints);
        //判断奇偶
        int middleIndex = ints.length/2;
        if (ints.length%2 == 0){//偶数
            return (ints[middleIndex]+ints[middleIndex-1])/2.0;
        }else {//奇数
            return ints[middleIndex]/2.0;
        }
    }
}

都写在注释里面了,二分法和二分边界分割法我后续再更新。


http://www.kler.cn/a/600851.html

相关文章:

  • 纯HTML+CSS实现3D空间正方体旋转
  • Opencv计算机视觉编程攻略-第三节 图像颜色处理
  • 23种设计模式-中介者(Mediator)设计模式
  • 网关助力冶金厂电表数据高效采集与监控
  • 【Redis】redis实现消息的发布和订阅
  • 使用python爬取网络资源
  • sendRedirect()和forward()方法有什么区别?
  • 嵌入式系统应用-拓展-STM32 低功耗设计
  • unittest自动化测试实战
  • 【ESP32S3】esp32获取串口数据并通过http上传到前端
  • Docker 搭建 PlantUML 服务:高效生成 UML 图的最佳实践
  • 36.评论日记
  • QT原子变量:QAtomicInteger、QAtomicPointer、QAtomicFlag
  • Win11 环境使用WSL安装Ubunut系统
  • winstart.wsf 病毒清理大作战
  • “需求引致供给“在互联网时代的范式重构:基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的技术经济学分析
  • 计算机网络 --应用层
  • 【设计模式】深入解析装饰器模式(Decorator Pattern)
  • 什么是Dify,以及我们能用它来做什么
  • Docker镜像相关命令(Day2)