首页 > 其他分享 >4. 寻找两个正序数组的中位数

4. 寻找两个正序数组的中位数

时间:2022-12-01 20:58:18浏览次数:40  
标签:正序 num1 num2 int 中位数 数组 return nums1 nums2

#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
    Solution(){}
    ~Solution(){}
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        //两个数组的总长度
        int len=nums1.size()+nums2.size();
        if (len%2==1)
        {
            //总长度为奇数,则为中间数为中位数
            return getKValue(nums1,nums2,len/2+1);
        }else{
            //总长度为偶数,则中间两数的平均数为中位数
            return (getKValue(nums1,nums2,len/2)+getKValue(nums1,nums2,len/2+1))/2.0;
        }
    }
    
    int getKValue(vector<int>&num1,vector<int>&num2,int k){
        int len1=num1.size();
        int len2=num2.size();
        int index1=0,index2=0;
        while (true)
        {   
            //处理边界
            if(index1==len1){
                return num2[index2+k-1];
            }
            if(index2==len2){
                return num1[index1+k-1];
            }
            if (k==1)
            {
                return min(num1[index1],num2[index2]);
            }
            //当前num1和num2起始的位置 
            int newIndex1=min(index1+k/2-1,len1-1);
            int newIndex2=min(index2+k/2-1,len2-1);
            int pov1=num1[newIndex1];
            int pov2=num2[newIndex2];
            //当前index前面的值可以丢弃,并更新index的位置,k也随着变小
            if (pov1<=pov2)
            {
                k=k-(newIndex1-index1+1);
                index1=newIndex1+1;
            }else{
                k=k-(newIndex2-index2+1);
                index2=newIndex2+1;
            }
        }
    }
};

int main(){
    Solution s;
    vector<int> nums1={1,2}; 
    vector<int> nums2={3,4}; 
    cout<<s.findMedianSortedArrays(nums1,nums2);
}

 

标签:正序,num1,num2,int,中位数,数组,return,nums1,nums2
From: https://www.cnblogs.com/Yshun/p/16942646.html

相关文章

  • golang 模拟byte数组
    packagemainimport("fmt")typeBytes[]bytefuncmain(){ fmt.Println("hello") fmt.Println("--------------") //ascii字符=============================......
  • acwing 140. 后缀数组
    把字符串S的所有后缀按照字典序排列,排名为i的后缀记为SA[i] 额外地,我们考虑排名为i的后缀与排名为 i-1的后缀,把二者的最长公共前缀的长度记为hgt[i]使用快排......
  • 剑指offer:数组中出现次数超过一半的数字
    题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因......
  • 剑指offer:数组中的逆序对
    题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。classSolution{public:intInv......
  • List集合转换成数组
    我现在有个需求:将File集合转换成MultipartFile数组结构然后我就开始在网上开启了List转换到数组之旅。首先来看一个例子ArrayList<String>list=newArrayList<......
  • vue2 数组18 some erver filter reduce axios
    some: return true是固定写法,终止some循环 erver: filter:   优化写法:arr.filter(item=>item.state).reduce((累加的结果,当前循环项)=>{},初始值)拿上......
  • Go--求数组奇偶数之和
    packagemain//申明main包import"fmt"//导入fmt标准库funcmain(){arr:=[...]int{01,11,22,33,44,55,66,77,88,99,98,87,76,65,54,43,32,......
  • js 将长度不确定的数组分割成n个一组的数组
    代码实现:consttransSliceImg=(imgs,num)=>{letnewImgs=[]returnimgs.reduce(function(pre,item,index,imgs){varbegin=index*num;......
  • Js 数组筛选重复项
    js数组去重复:Array.prototype.distinct=function(){vararr=this,result=[],i,j,len=arr.length;for(i=0;i<len;......
  • numpy获取数组最大值和索引
    他俩都是在60频率但是不清楚每个频率的振幅分布在哪。importmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspdimporttorchimportnumpyasnpdf=......