分治法求解中位数

简介: 分治法求解中位数

来先上代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            if(nums1.size() > nums2.size()){ //如果nums1的长度大于nums2,则交换
                return findMedianSortedArrays(nums2,nums1);
            }
            int len1 = nums1.size();
            int len2 = nums2.size();
            //分割线左边的元素的个数,如果是奇数我们让左边的个数多一个
            int total_left = (len1 + len2 + 1) / 2; //向下取整
            //我们在长度小的那个数组里找分割线,那么长度大的一定含有分割线
            //[0,len1]
            int left  =  0;
            int right =  len1;
            //我们是不是要确定 left 和 right 的位置呀
            //我们在这层循环里只寻妖考虑短的那一边 [0,len1]-->在这里面找分割线
            while(left < right){
                int i = left + (right - left + 1)/2;   //从中间开始-->第一个数组里去的个数
                int j = total_left - i;         //从第二个数组里取的个数
                if(nums1[i - 1] > nums2[j]){
                    right = i - 1;      //那么分割线所在的区间一定为[0,i-1]
                }else{
                    left = i;
                }
            }
            //判断结果
            int i = left;  //-->第一个数组里分割线左边的个数
            int j = total_left - i; //-->第二个数组里分割线左边的个数
            //第一个数组左边最小的和右边最大的
            int nums1LeftMax = i== 0  ? INT_MIN : nums1[i - 1];
            int nums1RightMin = i== len1 ? INT_MAX : nums1[i];
            //第二个数组左边最小的和右边最大的
            int nums2LeftMax = j== 0  ? INT_MIN : nums2[j - 1];
            int nums2RightMin = j== len2 ? INT_MAX : nums2[j];
            if((len1 + len2) % 2 == 0){ //偶数个-->左边最大的和右边最小的和
                int ans1 = max(nums1LeftMax,nums2LeftMax);
                int ans2 = min(nums1RightMin,nums2RightMin);
                return double((ans1 + ans2)/2.0);
            }else{//奇数个-->左边最大大的
                return (double)max(nums1LeftMax,nums2LeftMax);
            }
    }
};
相关文章
|
6月前
|
算法 C语言
分治法——找众数
分治法——找众数
|
6月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
算法
【算法专题突破】二分查找 - x 的平方根(18)
【算法专题突破】二分查找 - x 的平方根(18)
67 0
|
6月前
|
存储 算法
二分查找的一种改进-拉格朗日插值查找法
二分查找的一种改进-拉格朗日插值查找法
31 0
|
3月前
|
算法
【算法】二分算法——x的平方根
【算法】二分算法——x的平方根
|
C++ 容器
求解子序列
求解子序列
64 0
|
人工智能 算法
有序数组的平方
有序数组的平方
【分治法】众数问题
【分治法】众数问题
380 0
【分治法】众数问题
|
人工智能 算法
排序不等式(贪心)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——排序不等式,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
105 0
排序不等式(贪心)
|
人工智能
Letcode 53. 最大子序和 (动态规划+分治法求解)
Letcode 53. 最大子序和 (动态规划+分治法求解)
128 0