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

【Hot100】LeetCode—4. 寻找两个正序数组的中位数

目录

  • 1- 思路
    • 题目识别
    • 二分
  • 2- 实现
    • 4. 寻找两个正序数组的中位数——题解思路
  • 3- ACM 实现


  • 原题链接:4. 寻找两个正序数组的中位数

1- 思路

题目识别

  • 识别1 :给定两个数组 nums1nums2 ,找出数组的中位数

二分

思路

  • 将寻找中位数 ——> 寻找两个合并数组的第 K 大 (K代表中位数)

实现

  • ① 遍历两个数组 :通过比较两个数组的第 [k/2] 个元素 ,如果 numsA[k/2] < numsB[k/2] 的时候,删除 numsA 的前半部分元素。
  • ② 找剩余的k/2 个元素

其实现思路在于,始终让 nums1 为元素数量少的数组


2- 实现

4. 寻找两个正序数组的中位数——题解思路

在这里插入图片描述

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 1. 长度
        int len1 = nums1.length;
        int len2 = nums2.length;

        // 定义 right
        // 排除奇、偶 影响
        int left = (len1+len2+1)/2;
        int right = (len1+len2+2)/2;
        return ((findK(nums1,0,len1-1,nums2,0,len2-1,left) + findK(nums1,0,len1-1,nums2,0,len2-1,right))*0.5);
    }

    public int findK(int[] nums1,int start1,int end1,int[] nums2,int start2,int end2,int k){
        // 始终让 nums2 最长
        int len1 = end1 - start1+1;
        int len2 = end2 - start2+1;
        if(len1>len2) return findK(nums2,start2,end2,nums1,start1,end1,k);

        // 判断
        if(len1==0) return nums2[start2+k-1];
        if(k == 1) return Math.min(nums1[start1],nums2[start2]);

        // 递归逻辑
        int i = start1 + (Math.min(len1,k/2)-1);
        int j = start2 + (Math.min(len2,k/2)-1);

        if(nums1[i] > nums2[j]){
            return findK(nums1,start1,end1,nums2,j+1,end2,k-(j-start2+1));
        }else{
            return findK(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1));
        }

    }
}

3- ACM 实现

public class findM {

    public static double findMid(int[] nums1,int[] nums2){
        int len1 = nums1.length;
        int len2 = nums2.length;


        int left = (len1+len2+1)/2;
        int right = (len1+len2+2)/2;

        return ((findK(nums1,0,len1-1,nums2,0,len2-1,left) + findK(nums1,0,len1-1,nums2,0,len2-1,right))*0.5);
    }


    private static double findK(int[] nums1,int start1,int end1,int[] nums2,int start2,int end2,int k){
        // 递归终止
        int len1 = end1 - start1 + 1;
        int len2 = end2 - start2 + 1;
        if(len1>len2) return findK(nums2,start2,end2,nums1,start1,end1,k);

        // 终止
        if(len1==0) return nums2[start2+k-1];
        if(k == 1) return Math.min(nums1[start1],nums2[start2]);

        // 递归
        int i = start1 + (Math.min(len1,k/2)-1);
        int j = start2 + (Math.min(len2,k/2)-1);


        if(nums1[i] > nums2[j]){
            return findK(nums1,start1,end1,nums2,j+1,end2,k - (j-start2+1));
        }else{
            return findK(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1));
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        input = input.replace("[","").replace("]","");

        String input2 = sc.nextLine();
        input2 = input2.replace("[","").replace("]","");

        String[] parts = input.split(",");
        int[] nums = new int[parts.length];
        for(int i = 0 ; i < nums.length;i++){
            nums[i] = Integer.parseInt(parts[i]);
        }

        String[] parts2 = input2.split(",");
        int[] nums2 = new int[parts.length];
        for(int i = 0 ; i < nums2.length;i++){
            nums2[i] = Integer.parseInt(parts2[i]);
        }

        System.out.println("结果是"+findMid(nums,nums2));

    }
}

http://www.kler.cn/news/308250.html

相关文章:

  • 简单易懂的变动率指标ROC,做短线的快来了解一下
  • 超链接/表格/表单的复习(课后作业)
  • 蓝桥杯DS18B20程序源码
  • 【数据结构】4——树和森林
  • Mastering openFrameworks_第十一章_网络
  • 身份识别与服装类型检测系统源码分享
  • 基于微信小程序图书馆自习室座位预约小程序
  • USB组合设备——串口+鼠标+键盘
  • WPS生成目录
  • OpengGL教程(六)---坐标的变换和坐标系的变换
  • 文献多\bibliographystyle和文献少\begin{thebibliography}
  • 【JAVA】数据脱敏技术(对称加密算法、非对称加密算法、哈希算法、消息认证码(MAC)算法、密钥交换算法)使用方法
  • JUC学习笔记(二)
  • sed编辑器与awk的用法
  • 0917np.power()
  • 径向基函数神经网络RBFNN案例实操
  • 人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作
  • 3GPP祝大家中秋快乐!!!
  • 数据结构,栈,队列(线性表实现)
  • 云服务与虚拟主机:数字时代的网络托管选择
  • 光华里社区“电亮生活”行动:智能科技携手志愿温情,老旧小区焕发新生机
  • 在docker环境下启动php的注意事项-docker完整挂载php目录、在Docker查看容器完整启动命令以及mysql ERROR 2059问题
  • win+linux平台C语言获取进程的线程数量
  • LeetCode 815.公交路线(BFS广搜 + 建图)(中秋快乐啊)
  • 从零到一:构建你的第一个AI项目(实战教程)
  • Python 数学建模——Pearson/Spearman 相关系数
  • easy-es动态索引支持
  • 数据库的约束
  • Java4----String
  • 【新片场-注册安全分析报告-无验证方式导致安全隐患】