时间复杂度为O(logn)&O(log(m+n))

Olog(n) 折半查找,欧几里得算法,幂运算。

折半查找

int binary_search(int a[], int x)
{

//折半查找默认数组已经排序
    int low = 0, high = a.length() - 1;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (a[mid] < x)
            low = mid + 1;
        else if (a[mid] > x)
            high = mid - 1;
        else
            return mid;
    }
    return -1;
}

欧几里得算法求最大公因数

int gcd(int m, int n)
{
    //m>n
    while (n != 0)
    {
        int yu = m % n;
        m = n;
        n = yu;
    }
    return m;
}

幂运算

int pow_m(int x, int y)
{
    //x的y次
    if (y == 0)
        return 1;
    if (y == 1)
        return x;
    if (y % 2 == 0)
        return pow_m(x*x, y / 2);
    if (y % 2 == 1)
        return x * pow_m(x*x, y / 2);
}

O(log(m+n))  归并排序

float median(vector<int>& nums1,vector<int>& nums2 )
{
    int x1 = nums1.size();
    int x2 = nums2.size();
    if (nums1.empty())
    {
        if (nums2.size() % 2 == 0)
            return (nums2[x2 / 2] + nums2[x2 / 2 - 1]) / 2;
        if (nums2.size() % 2 != 0)
            return nums2[x2 / 2];
    }
    if (nums2.empty())
    {
        if (nums1.size() % 2 == 0)
            return (nums1[x1 / 2] + nums2[x1 / 2 - 1]) / 2;
        if (nums1.size() % 2 != 0)
            return nums1[x1 / 2];
    }
    //归并排序
    vector<int>c;
    int i, j, k;//分别为nums1,nums2,c的下标
    for (i = 0, j = 0; i < x1&&j < x2;)
    {
        if (nums1[i] < nums2[j])
        {
            c.push_back(nums1[i]);
            i++;
        }
        else
            c.push_back(nums2[j++]);
    }
    while (i < x1)
    {
        c.push_back(nums1[i++]);
    }
    while (j < x2)
    {
        c.push_back(nums2[j++]);
    }
    int k = c.size();
    if (k% 2 == 0)
        return (c[k / 2] + nums2[k - 1]) / 2;
    if (k % 2 != 0)
        return nums1[k / 2];
//归并排序,顺便求了中位数
}

 

转载于:https://www.cnblogs.com/yz-lucky77/p/11193409.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值