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

news/2024/7/8 2:25:34 标签: leetcode, java, 算法

目录

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


题目

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

1- 思路

思路

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

实现

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

2- 实现

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

在这里插入图片描述

java">class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 定义 
        int n = nums1.length;
        int m = nums2.length;

        // 用来将 奇数长度 和 偶数长度合并
        int left = (n+m+1)/2;
        int right = (n+m+2)/2;
        return (getKth(nums1,0,n-1,nums2,0,m-1,left)+getKth(nums1,0,n-1,nums2,0,m-1,right))*0.5;
    }

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

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

        // 2. 递归逻辑
        // 2.1 更新start用于递归:保证尽可能不越界 
        int i = start1 + Math.min(len1,k/2) -1;
        int j = start2 + Math.min(len2,k/2) -1;

        // 2.2 删除逻辑
        if(nums1[i] > nums2[j]){
            return getKth(nums1,start1,end1,nums2,j+1,end2,k-(j - start2 + 1));
        }else{
            return getKth(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1));
        }
    }
}

3- ACM 实现

java">
public class midNum {
    public static double twoNumMid(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 (getKth(nums1,0,len1-1,nums2,0,len2-1,left)+getKth(nums1,0,len1-1,nums2,0,len2-1,right))*0.5;
    }

    // 递归
    public static int getKth(int[] nums1,int start1,int end1,int[] nums2,int start2,int end2,int k){
        // 找len
        int len1 = end1-start1+1;
        int len2 = end2-start2+1;

        if(len1>len2) return getKth(nums2,start2,end2,nums1,start1,end1,k);

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

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

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

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入数组1的长度");
        int n = sc.nextInt();
        int[] nums1 = new int[n];
        System.out.println("输入数组1元素");
        for(int i = 0 ; i < n ; i ++){
            nums1[i] = sc.nextInt();
        }

        System.out.println("输入数组2的长度");
        int m = sc.nextInt();
        int[] nums2 = new int[m];
        System.out.println("输入数组2元素");
        for(int j = 0 ; j < m;j++){
            nums2[j] = sc.nextInt();
        }

        double res = twoNumMid(nums1,nums2);
        System.out.println("中位数是"+res);

    }
}


http://www.niftyadmin.cn/n/5536131.html

相关文章

【机器学习实战】Baseline精读笔记

比赛用到的库 numpy&#xff1a;提供&#xff08;多维&#xff09;数组操作 pandas&#xff1a;提供数据结构、数据分析 catboost&#xff1a;用于机器学习的库&#xff0c;特别是分类和回归任务 sklearn.model_selection&#xff1a;包含模型选择的多种方法&#xff0c;如交…

【第六节】C/C++静态查找算法

目录 前言 一、搜索查找 二、查找算法 1. 线性查找&#xff08;Linear Search&#xff09; 2. 二分查找&#xff08;Binary Search&#xff09; 3. 插值查找&#xff08;Interpolation Search&#xff09; 4. 哈希查找&#xff08;Hash Search&#xff09; 5. Fibonacc…

【Git】忘记切换分支! 如何将一个分支上的修改转移到另一个分支上去?

【Git】忘记切换分支! 如何将一个分支上的修改转移到另一个分支上去? step1: 使用git stash暂存修改step2: 切换回要提交的分支step3: 应用特定的stash step1: 使用git stash暂存修改 git stash 命令可以添加一些描述性的信息, 方便识别自己的暂存内容. 以下是具体的使用方法…

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产

任务描述 电信数据生产是一个完整且严密的体系&#xff0c;这样可以保证数据的鲁棒性。在本项目的数据生产模块中&#xff0c;我们来模拟生产一些电信数据。同时&#xff0c;我们必须清楚电信数据的格式和数据结构&#xff0c;这样才能在后续的数据产生、存储、分析和展示环节…

【观察】三合实业X华为:十载风雨同舟路,奋楫逐浪向未来

十年前&#xff0c;广东三合电子实业有限公司&#xff08;以下简称&#xff1a;三合实业&#xff09;正式成立&#xff0c;同年成为华为金牌伙伴&#xff0c;由此也开启了与华为深度“结缘”的十年。 十年来&#xff0c;作为华为“铁杆”的合作伙伴&#xff0c;三合实业始终与华…

力扣(2024.07.01)

1. 84——柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 标签&#xff1a;栈&#xff0c;数组&#xff0c;单调栈&#xff08;目…

Arduino - Keypad 键盘

Arduino - Keypad Arduino - Keypad The keypad is widely used in many devices such as door lock, ATM, calculator… 键盘广泛应用于门锁、ATM、计算器等多种设备中。 In this tutorial, we will learn: 在本教程中&#xff0c;我们将学习&#xff1a; How to use key…

【Qt知识】qrc机制

在Qt中&#xff0c;qrc机制是一种资源管理系统&#xff0c;它允许你将应用程序所需的静态资源&#xff0c;如图像、样式表、字体和音频文件&#xff0c;嵌入到可执行文件中而不是作为外部文件存在。这样做的好处是资源管理更加安全&#xff0c;因为它们不会丢失或被意外修改&am…