zoukankan      html  css  js  c++  java
  • leetcode-----4. 寻找两个正序数组的中位数

    思路

    将该问题转换为求第(m + n) / 2小的数即为中位数。
    1.假设m和n均大于k / 2,则各取前k / 2个元素。
    若nums1[k / 2 - 1] > nums2[k / 2 - 1],则表示nums1中的元素过多,nums2中的元素过少;则nums2中的前k / 2个元素小于等于第k小的数,则将问题转换为在剩下的数中找k - k / 2小数。反之同理。
    2.若m < k / 2,则从nums1中去出m个元素,从nums2中取出k / 2个元素。
    若nums1[m - 1] > nums2[k / 2 - 1],则表示nums2中的前k / 2个元素都小于等于第k小数,则将问题转换为在剩下的数中找k - k / 2小数。
    若nums1[m - 1] <= nums2[k / 2 - 1],则表示nums1中的所有元素都小于等于第k小数,则第k小数为nums2[k - m - 1]。

    代码

    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int total = nums1.length + nums2.length;
            if (total % 2 == 0) {
                int left = findKthElement(nums1, 0, nums2, 0, total / 2);
                int right = findKthElement(nums1, 0, nums2, 0, total / 2 + 1);
                return (left + right) / 2.0;
            } else {
                return findKthElement(nums1, 0, nums2, 0, total / 2 + 1);
            }
        }
    
        int findKthElement(int[] nums1, int i, int[] nums2, int j, int k) {
            if (nums1.length - i > nums2.length - j) return findKthElement(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, (int)nums1.length);
            int sj = j + k / 2;
            if (nums1[si - 1] > nums2[sj - 1]) {
                return findKthElement(nums1, i, nums2, j + k / 2, k - k / 2);
            } else {
                return findKthElement(nums1, si, nums2, j, k - (si - i));
            }
        }
    }
    
  • 相关阅读:
    Windows删除被占用的文件或文件夹
    Fatal error in launcher: Unable to create process using
    World/excel无法同时打开两个解决办法
    Zabbix故障处理系列
    第1章 数据库系统概述
    第2章 关系数据库
    第3章 数据库设计
    Linux命令概况
    Python -扩展C++-Pytorch扩展
    技术栈_人工智能-大数据-云计算
  • 原文地址:https://www.cnblogs.com/clown9804/p/13027932.html
Copyright © 2011-2022 走看看